15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)'use strict'; 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * MetadataCache is a map from Entry to an object containing properties. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Properties are divided by types, and all properties of one type are accessed 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * at once. 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Some of the properties: 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * filesystem: size, modificationTime 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * internal: presence 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * external: pinned, present, hosted, availableOffline 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Following are not fetched for non-present external files. 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * media: artist, album, title, width, height, imageTransform, etc. 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * thumbnail: url, transform 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Following are always fetched from content, and so force the downloading 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * of external files. One should use this for required content metadata, 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * i.e. image orientation. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * fetchedMedia: width, height, etc. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * } 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Typical usages: 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * { 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * cache.get([entry1, entry2], 'external|filesystem', function(metadata) { 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * if (metadata[0].external.pinned && metadata[1].filesystem.size === 0) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * alert("Pinned and empty!"); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * }); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * cache.set(entry, 'internal', {presence: 'deleted'}); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * cache.clear([fileEntry1, fileEntry2], 'filesystem'); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * // Getting fresh value. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * cache.clear(entry, 'thumbnail'); 4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) * cache.getOne(entry, 'thumbnail', function(thumbnail) { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * img.src = thumbnail.url; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * }); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * var cached = cache.getCached(entry, 'filesystem'); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * var size = (cached && cached.size) || UNKNOWN_SIZE; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * } 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) * @param {Array.<MetadataProvider>} providers Metadata providers. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @constructor 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)function MetadataCache(providers) { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Map from Entry (using Entry.toURL) to metadata. Metadata contains 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * |properties| - an hierarchical object of values, and an object for each 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * metadata provider: <prodiver-id>: {time, callbacks} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @private 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.cache_ = {}; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * List of metadata providers. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @private 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) this.providers_ = providers; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * List of observers added. Each one is an object with fields: 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * re - regexp of urls; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * type - metadata type; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * callback - the callback. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @private 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.observers_ = []; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.observerId_ = 0; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.batchCount_ = 0; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.totalCount_ = 0; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this.currentCacheSize_ = 0; 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Time of first get query of the current batch. Items updated later than this 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * will not be evicted. 846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) * 856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) * @type {Date} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @private 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.lastBatchStart_ = new Date(); 896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) Object.seal(this); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Observer type: it will be notified if the changed Entry is exactly the same 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * as the observed Entry. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MetadataCache.EXACT = 0; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Observer type: it will be notified if the changed Entry is an immediate child 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * of the observed Entry. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MetadataCache.CHILDREN = 1; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Observer type: it will be notified if the changed Entry is a descendant of 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * of the observer Entry. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MetadataCache.DESCENDANTS = 2; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Margin of the cache size. This amount of caches may be kept in addition. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MetadataCache.EVICTION_THRESHOLD_MARGIN = 500; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {VolumeManagerWrapper} volumeManager Volume manager instance. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return {MetadataCache!} The cache with all providers. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MetadataCache.createFull = function(volumeManager) { 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // ExternalProvider should be prior to FileSystemProvider, because it covers 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // FileSystemProvider for files on the external backend, eg. Drive. 1236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return new MetadataCache([ 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new ExternalProvider(volumeManager), 1256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) new FilesystemProvider(), 1266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) new ContentProvider() 1276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ]); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Clones metadata entry. Metadata entries may contain scalars, arrays, 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * hash arrays and Date object. Other objects are not supported. 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {Object} metadata Metadata object. 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @return {Object} Cloned entry. 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MetadataCache.cloneMetadata = function(metadata) { 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (metadata instanceof Array) { 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var result = []; 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (var index = 0; index < metadata.length; index++) { 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result[index] = MetadataCache.cloneMetadata(metadata[index]); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (metadata instanceof Date) { 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var result = new Date(); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result.setTime(metadata.getTime()); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (metadata instanceof Object) { // Hash array only. 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var result = {}; 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (var property in metadata) { 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (metadata.hasOwnProperty(property)) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result[property] = MetadataCache.cloneMetadata(metadata[property]); 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return metadata; 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return {boolean} Whether all providers are ready. 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MetadataCache.prototype.isInitialized = function() { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var index = 0; index < this.providers_.length; index++) { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!this.providers_[index].isInitialized()) return false; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 170f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * Changes the size of cache by delta value. The actual cache size may be larger 171f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * than the given value. 172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * 173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * @param {number} delta The delta size to be changed the cache size by. 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */ 175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)MetadataCache.prototype.resizeBy = function(delta) { 176f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) this.currentCacheSize_ += delta; 177f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (this.currentCacheSize_ < 0) 178f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) this.currentCacheSize_ = 0; 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (this.totalCount_ > this.currentEvictionThreshold_()) 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this.evict_(); 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/** 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Returns the current threshold to evict caches. When the number of caches 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * exceeds this, the cache should be evicted. 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @return {number} Threshold to evict caches. 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @private 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */ 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MetadataCache.prototype.currentEvictionThreshold_ = function() { 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return this.currentCacheSize_ * 2 + MetadataCache.EVICTION_THRESHOLD_MARGIN; 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/** 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Fetches the metadata, puts it in the cache, and passes to callback. 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If required metadata is already in the cache, does not fetch it again. 197f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * 19846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) * @param {Array.<Entry>} entries The list of entries. 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} type The metadata type. 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {function(Object)} callback The metadata is passed to callback. 201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * The callback is called asynchronously. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MetadataCache.prototype.get = function(entries, type, callback) { 204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch this.getInternal_(entries, type, false, callback); 205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 206f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 207f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)/** 208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * Fetches the metadata, puts it in the cache, and passes to callback. 209f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * Even if required metadata is already in the cache, fetches it again. 210f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * 211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * @param {Array.<Entry>} entries The list of entries. 212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * @param {string} type The metadata type. 213f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * @param {function(Object)} callback The metadata is passed to callback. 214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * The callback is called asynchronously. 215f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) */ 216116680a4aac90f2aa7413d9095a592090648e557Ben MurdochMetadataCache.prototype.getLatest = function(entries, type, callback) { 217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch this.getInternal_(entries, type, true, callback); 218f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 219f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 220f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)/** 221f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * Fetches the metadata, puts it in the cache. This is only for internal use. 222f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * 223f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * @param {Array.<Entry>} entries The list of entries. 224f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * @param {string} type The metadata type. 225f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * @param {boolean} refresh True to get the latest value and refresh the cache, 226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * false to get the value from the cache. 227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * @param {function(Object)} callback The metadata is passed to callback. 228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * The callback is called asynchronously. 2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @private 230f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) */ 231f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)MetadataCache.prototype.getInternal_ = 232f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) function(entries, type, refresh, callback) { 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (entries.length === 0) { 234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (callback) setTimeout(callback.bind(null, []), 0); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var result = []; 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) var remaining = entries.length; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.startBatchUpdates(); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var onOneItem = function(index, value) { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result[index] = value; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remaining--; 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (remaining === 0) { 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.endBatchUpdates(); 247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (callback) callback(result); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (var index = 0; index < entries.length; index++) { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.push(null); 253f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) this.getOneInternal_(entries[index], 254f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) type, 255f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) refresh, 256f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) onOneItem.bind(this, index)); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Fetches the metadata for one Entry. See comments to |get|. 2625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * If required metadata is already in the cache, does not fetch it again. 263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {Entry} entry The entry. 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} type Metadata type. 266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * @param {function(Object)} callback The metadata is passed to callback. 267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * The callback is called asynchronously. 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)MetadataCache.prototype.getOne = function(entry, type, callback) { 270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch this.getOneInternal_(entry, type, false, callback); 271f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 272f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 273f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)/** 274f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * Fetches the metadata for one Entry. This is only for internal use. 275f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * 276f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * @param {Entry} entry The entry. 277f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * @param {string} type Metadata type. 278f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * @param {boolean} refresh True to get the latest value and refresh the cache, 279f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * false to get the value from the cache. 280116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * @param {function(Object)} callback The metadata is passed to callback. 281116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * The callback is called asynchronously. 282f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * @private 283f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) */ 284f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)MetadataCache.prototype.getOneInternal_ = 285f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) function(entry, type, refresh, callback) { 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (type.indexOf('|') !== -1) { 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var types = type.split('|'); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var result = {}; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var typesLeft = types.length; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var onOneType = function(requestedType, metadata) { 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result[requestedType] = metadata; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typesLeft--; 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (typesLeft === 0) callback(result); 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var index = 0; index < types.length; index++) { 298f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) this.getOneInternal_(entry, types[index], refresh, 299f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) onOneType.bind(null, types[index])); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback = callback || function() {}; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) var entryURL = entry.toURL(); 3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!(entryURL in this.cache_)) { 3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this.cache_[entryURL] = this.createEmptyItem_(); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.totalCount_++; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) var item = this.cache_[entryURL]; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 314f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!refresh && type in item.properties) { 315f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Uses cache, if available and not on the 'refresh' mode. 316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch setTimeout(callback.bind(null, item.properties[type]), 0); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.startBatchUpdates(); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var providers = this.providers_.slice(); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var currentProvider; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var self = this; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) var queryProvider = function() { 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var id = currentProvider.getId(); 327f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 328f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // If on 'refresh'-mode, replaces the callback array. The previous 329f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // array may be remaining in the closure captured by previous tasks. 330f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (refresh) 331f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) item[id].callbacks = []; 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) var fetchedCallbacks = item[id].callbacks; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 334f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) var onFetched = function() { 335f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (type in item.properties) { 336f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) self.endBatchUpdates(); 337f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Got properties from provider. 338f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) callback(item.properties[type]); 339f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } else { 340f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) tryNextProvider(); 341f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 342f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) }; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 344f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) var onProviderProperties = function(properties) { 345f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) var callbacks = fetchedCallbacks.splice(0); 346f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) item.time = new Date(); 347f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) self.mergeProperties_(entry, properties); 348f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 349f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (var index = 0; index < callbacks.length; index++) { 350f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) callbacks[index](); 351f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 352f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) }; 353f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 354f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) fetchedCallbacks.push(onFetched); 355f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 356f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Querying now. 357f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (fetchedCallbacks.length === 1) 3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) currentProvider.fetch(entry, type, onProviderProperties); 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var tryNextProvider = function() { 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (providers.length === 0) { 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.endBatchUpdates(); 364116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch setTimeout(callback.bind(null, item.properties[type] || null), 0); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) currentProvider = providers.shift(); 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (currentProvider.supportsEntry(entry) && 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) currentProvider.providesType(type)) { 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) queryProvider(); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tryNextProvider(); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tryNextProvider(); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the cached metadata value, or |null| if not present. 382010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * @param {Entry} entry Entry. 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} type The metadata type. 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return {Object} The metadata or null. 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 386010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)MetadataCache.prototype.getCached = function(entry, type) { 387010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Entry.cachedUrl may be set in DirectoryContents.onNewEntries_(). 388010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // See the comment there for detail. 389010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) var entryURL = entry.cachedUrl || entry.toURL(); 390010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) var cache = this.cache_[entryURL]; 391010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return cache ? (cache.properties[type] || null) : null; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Puts the metadata into cache 3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {Entry|Array.<Entry>} entries The list of entries. May be just a 3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * single entry. 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} type The metadata type. 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {Array.<Object>} values List of corresponding metadata values. 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MetadataCache.prototype.set = function(entries, type, values) { 4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!(entries instanceof Array)) { 4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) entries = [entries]; 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values = [values]; 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.startBatchUpdates(); 4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (var index = 0; index < entries.length; index++) { 4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) var entryURL = entries[index].toURL(); 4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!(entryURL in this.cache_)) { 4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this.cache_[entryURL] = this.createEmptyItem_(); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.totalCount_++; 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this.cache_[entryURL].properties[type] = values[index]; 4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this.notifyObservers_(entries[index], type); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.endBatchUpdates(); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Clears the cached metadata values. 4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {Entry|Array.<Entry>} entries The list of entries. May be just a 4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * single entry. 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {string} type The metadata types or * for any type. 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MetadataCache.prototype.clear = function(entries, type) { 4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!(entries instanceof Array)) 4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) entries = [entries]; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 430116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch this.clearByUrl( 431116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch entries.map(function(entry) { return entry.toURL(); }), 432116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch type); 433116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 434116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 435116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch/** 436116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * Clears the cached metadata values. This method takes an URL since some items 437116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * may be already removed and can't be fetches their entry. 438116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * 439116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * @param {Array.<string>} urls The list of URLs. 440116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * @param {string} type The metadata types or * for any type. 441116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch */ 442116680a4aac90f2aa7413d9095a592090648e557Ben MurdochMetadataCache.prototype.clearByUrl = function(urls, type) { 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var types = type.split('|'); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (var index = 0; index < urls.length; index++) { 446116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch var entryURL = urls[index]; 4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (entryURL in this.cache_) { 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type === '*') { 4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this.cache_[entryURL].properties = {}; 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (var j = 0; j < types.length; j++) { 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var type = types[j]; 4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delete this.cache_[entryURL].properties[type]; 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Clears the cached metadata values recursively. 4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {Entry} entry An entry to be cleared recursively from cache. 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {string} type The metadata types or * for any type. 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MetadataCache.prototype.clearRecursively = function(entry, type) { 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var types = type.split('|'); 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var keys = Object.keys(this.cache_); 4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) var entryURL = entry.toURL(); 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (var index = 0; index < keys.length; index++) { 4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) var cachedEntryURL = keys[index]; 4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (cachedEntryURL.substring(0, entryURL.length) === entryURL) { 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type === '*') { 4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this.cache_[cachedEntryURL].properties = {}; 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (var j = 0; j < types.length; j++) { 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var type = types[j]; 4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delete this.cache_[cachedEntryURL].properties[type]; 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Adds an observer, which will be notified when metadata changes. 4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {Entry} entry The root entry to look at. 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {number} relation This defines, which items will trigger the observer. 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See comments to |MetadataCache.EXACT| and others. 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} type The metadata type. 4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {function(Array.<Entry>, Object.<string, Object>)} observer Map of 4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * entries and corresponding metadata values are passed to this callback. 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return {number} The observer id, which can be used to remove it. 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MetadataCache.prototype.addObserver = function( 4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) entry, relation, type, observer) { 4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) var entryURL = entry.toURL(); 4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) var re; 4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (relation === MetadataCache.CHILDREN) 5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) re = entryURL + '(/[^/]*)?'; 5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (relation === MetadataCache.DESCENDANTS) 5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) re = entryURL + '(/.*)?'; 5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else 5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) re = entryURL; 5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var id = ++this.observerId_; 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.observers_.push({ 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) re: new RegExp('^' + re + '$'), 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type: type, 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback: observer, 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id: id, 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending: {} 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }); 5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return id; 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Removes the observer. 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {number} id Observer id. 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return {boolean} Whether observer was removed or not. 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MetadataCache.prototype.removeObserver = function(id) { 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var index = 0; index < this.observers_.length; index++) { 5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (this.observers_[index].id === id) { 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.observers_.splice(index, 1); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Start batch updates. 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MetadataCache.prototype.startBatchUpdates = function() { 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.batchCount_++; 5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (this.batchCount_ === 1) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.lastBatchStart_ = new Date(); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * End batch updates. Notifies observers if all nested updates are finished. 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MetadataCache.prototype.endBatchUpdates = function() { 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.batchCount_--; 5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (this.batchCount_ !== 0) return; 5485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (this.totalCount_ > this.currentEvictionThreshold_()) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.evict_(); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var index = 0; index < this.observers_.length; index++) { 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var observer = this.observers_[index]; 5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) var entries = []; 5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) var properties = {}; 5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (var entryURL in observer.pending) { 5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (observer.pending.hasOwnProperty(entryURL) && 5565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) entryURL in this.cache_) { 5575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) var entry = observer.pending[entryURL]; 5585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) entries.push(entry); 5595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) properties[entryURL] = 5605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this.cache_[entryURL].properties[observer.type] || null; 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer.pending = {}; 5645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (entries.length > 0) { 5655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observer.callback(entries, properties); 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Notifies observers or puts the data to pending list. 5725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {Entry} entry Changed entry. 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} type Metadata type. 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @private 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MetadataCache.prototype.notifyObservers_ = function(entry, type) { 5775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) var entryURL = entry.toURL(); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var index = 0; index < this.observers_.length; index++) { 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var observer = this.observers_[index]; 5805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (observer.type === type && observer.re.test(entryURL)) { 5815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (this.batchCount_ === 0) { 5825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Observer expects array of urls and map of properties. 5835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) var property = {}; 5845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) property[entryURL] = this.cache_[entryURL].properties[type] || null; 5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observer.callback( 5865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) [entry], property); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observer.pending[entryURL] = entry; 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Removes the oldest items from the cache. 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This method never removes the items from last batch. 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @private 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MetadataCache.prototype.evict_ = function() { 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var toRemove = []; 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We leave only a half of items, so we will not call evict_ soon again. 6035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) var desiredCount = this.currentEvictionThreshold_(); 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var removeCount = this.totalCount_ - desiredCount; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var url in this.cache_) { 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (this.cache_.hasOwnProperty(url) && 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.cache_[url].time < this.lastBatchStart_) { 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toRemove.push(url); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toRemove.sort(function(a, b) { 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var aTime = this.cache_[a].time; 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var bTime = this.cache_[b].time; 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return aTime < bTime ? -1 : aTime > bTime ? 1 : 0; 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }.bind(this)); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) removeCount = Math.min(removeCount, toRemove.length); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.totalCount_ -= removeCount; 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var index = 0; index < removeCount; index++) { 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete this.cache_[toRemove[index]]; 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 6265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @return {Object} Empty cache item. 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @private 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MetadataCache.prototype.createEmptyItem_ = function() { 6305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) var item = {properties: {}}; 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var index = 0; index < this.providers_.length; index++) { 632f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) item[this.providers_[index].getId()] = {callbacks: []}; 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return item; 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 6385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Caches all the properties from data to cache entry for the entry. 6395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {Entry} entry The file entry. 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {Object} data The properties. 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @private 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MetadataCache.prototype.mergeProperties_ = function(entry, data) { 6445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (data === null) return; 645f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) var entryURL = entry.toURL(); 646f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!(entryURL in this.cache_)) { 647f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) this.cache_[entryURL] = this.createEmptyItem_(); 648f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) this.totalCount_++; 649f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 650f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) var properties = this.cache_[entryURL].properties; 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var type in data) { 6520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (data.hasOwnProperty(type)) { 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) properties[type] = data[type]; 6545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this.notifyObservers_(entry, type); 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Base class for metadata providers. 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @constructor 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function MetadataProvider() { 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 6675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {Entry} entry The entry. 6685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @return {boolean} Whether this provider supports the entry. 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MetadataProvider.prototype.supportsEntry = function(entry) { return false; }; 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} type The metadata type. 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return {boolean} Whether this provider provides this metadata. 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MetadataProvider.prototype.providesType = function(type) { return false; }; 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return {string} Unique provider id. 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MetadataProvider.prototype.getId = function() { return ''; }; 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return {boolean} Whether provider is ready. 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MetadataProvider.prototype.isInitialized = function() { return true; }; 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Fetches the metadata. It's suggested to return all the metadata this provider 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * can fetch at once. 6915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {Entry} entry File entry. 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} type Requested metadata type. 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {function(Object)} callback Callback expects a map from metadata type 694116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * to metadata value. This callback must be called asynchronously. 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MetadataProvider.prototype.fetch = function(entry, type, callback) { 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) throw new Error('Default metadata provider cannot fetch.'); 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Provider of filesystem metadata. 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This provider returns the following objects: 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * filesystem: { size, modificationTime } 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @constructor 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function FilesystemProvider() { 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MetadataProvider.call(this); 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FilesystemProvider.prototype = { 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __proto__: MetadataProvider.prototype 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {Entry} entry The entry. 7175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @return {boolean} Whether this provider supports the entry. 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)FilesystemProvider.prototype.supportsEntry = function(entry) { 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} type The metadata type. 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return {boolean} Whether this provider provides this metadata. 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FilesystemProvider.prototype.providesType = function(type) { 7285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return type === 'filesystem'; 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return {string} Unique provider id. 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FilesystemProvider.prototype.getId = function() { return 'filesystem'; }; 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Fetches the metadata. 7385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {Entry} entry File entry. 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} type Requested metadata type. 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {function(Object)} callback Callback expects a map from metadata type 741116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * to metadata value. This callback is called asynchronously. 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)FilesystemProvider.prototype.fetch = function( 7445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) entry, type, callback) { 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function onError(error) { 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback(null); 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function onMetadata(entry, metadata) { 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback({ 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filesystem: { 7525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu size: (entry.isFile ? (metadata.size || 0) : -1), 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) modificationTime: metadata.modificationTime 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }); 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) entry.getMetadata(onMetadata.bind(null, entry), onError); 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 7621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Provider of metadata for entries on the external file system backend. 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This provider returns the following objects: 7641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * external: { pinned, hosted, present, customIconUrl, etc. } 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * thumbnail: { url, transform } 7665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {VolumeManagerWrapper} volumeManager Volume manager instance. 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @constructor 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifunction ExternalProvider(volumeManager) { 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MetadataProvider.call(this); 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) /** 7735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @type {VolumeManagerWrapper} 7745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @private 7755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */ 7765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this.volumeManager_ = volumeManager; 7775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We batch metadata fetches into single API call. 7795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this.entries_ = []; 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.callbacks_ = []; 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.scheduled_ = false; 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.callApiBound_ = this.callApi_.bind(this); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciExternalProvider.prototype = { 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __proto__: MetadataProvider.prototype 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 7915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {Entry} entry The entry. 7925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @return {boolean} Whether this provider supports the entry. 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciExternalProvider.prototype.supportsEntry = function(entry) { 7955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) var locationInfo = this.volumeManager_.getLocationInfo(entry); 7961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(mtomasz): Add support for provided file systems. 7975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return locationInfo && locationInfo.isDriveBased; 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} type The metadata type. 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return {boolean} Whether this provider provides this metadata. 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciExternalProvider.prototype.providesType = function(type) { 8051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return type === 'external' || type === 'thumbnail' || 8061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci type === 'media' || type === 'filesystem'; 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return {string} Unique provider id. 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciExternalProvider.prototype.getId = function() { return 'external'; }; 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Fetches the metadata. 8165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {Entry} entry File entry. 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} type Requested metadata type. 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {function(Object)} callback Callback expects a map from metadata type 819116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * to metadata value. This callback is called asynchronously. 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciExternalProvider.prototype.fetch = function(entry, type, callback) { 8225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this.entries_.push(entry); 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.callbacks_.push(callback); 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!this.scheduled_) { 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.scheduled_ = true; 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) setTimeout(this.callApiBound_, 0); 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Schedules the API call. 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @private 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciExternalProvider.prototype.callApi_ = function() { 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.scheduled_ = false; 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) var entries = this.entries_; 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var callbacks = this.callbacks_; 8395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this.entries_ = []; 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.callbacks_ = []; 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var self = this; 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(mtomasz): Move conversion from entry to url to custom bindings. 8441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // crbug.com/345527. 8450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch var entryURLs = util.entriesToURLs(entries); 8461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci chrome.fileManagerPrivate.getEntryProperties( 8470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch entryURLs, 8480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch function(propertiesList) { 8490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch console.assert(propertiesList.length === callbacks.length); 8500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch for (var i = 0; i < callbacks.length; i++) { 8510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch callbacks[i](self.convert_(propertiesList[i], entries[i])); 8520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 8530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch }); 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Converts API metadata to internal format. 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {Object} data Metadata from API call. 8595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {Entry} entry File entry. 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return {Object} Metadata in internal format. 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @private 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciExternalProvider.prototype.convert_ = function(data, entry) { 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var result = {}; 8651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result.external = { 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) present: data.isPresent, 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pinned: data.isPinned, 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hosted: data.isHosted, 8694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) imageWidth: data.imageWidth, 8704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) imageHeight: data.imageHeight, 8714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) imageRotation: data.imageRotation, 8721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci availableOffline: data.isAvailableOffline, 8731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci availableWhenMetered: data.isAvailableWhenMetered, 874424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) customIconUrl: data.customIconUrl || '', 875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) contentMimeType: data.contentMimeType || '', 876a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) sharedWithMe: data.sharedWithMe, 8771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci shared: data.shared, 8781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci thumbnailUrl: data.thumbnailUrl // Thumbnail passed from external server. 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result.filesystem = { 8825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu size: (entry.isFile ? (data.fileSize || 0) : -1), 8835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu modificationTime: new Date(data.lastModifiedTime) 8845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu }; 8855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 8861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (data.isPresent) { 8871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // If the file is present, don't fill the thumbnail here and allow to 8881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // generate it by next providers. 8891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result.thumbnail = null; 8901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else if ('thumbnailUrl' in data) { 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.thumbnail = { 8925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url: data.thumbnailUrl, 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transform: null 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 8950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } else { 8961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Not present in cache, so do not allow to generate it by next providers. 8970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch result.thumbnail = {url: '', transform: null}; 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 9001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // If present in cache, then allow to fetch media by next providers. 9010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch result.media = data.isPresent ? null : {}; 9020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Provider of content metadata. 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This provider returns the following objects: 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * thumbnail: { url, transform } 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * media: { artist, album, title, width, height, imageTransform, etc. } 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * fetchedMedia: { same fields here } 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @constructor 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function ContentProvider() { 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MetadataProvider.call(this); 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pass all URLs to the metadata reader until we have a correct filter. 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.urlFilter_ = /.*/; 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu var dispatcher = new SharedWorker(ContentProvider.WORKER_SCRIPT).port; 9225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu dispatcher.onmessage = this.onMessage_.bind(this); 9235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu dispatcher.postMessage({verb: 'init'}); 9245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu dispatcher.start(); 9255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu this.dispatcher_ = dispatcher; 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialization is not complete until the Worker sends back the 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 'initialized' message. See below. 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.initialized_ = false; 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Map from Entry.toURL() to callback. 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that simultaneous requests for same url are handled in MetadataCache. 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.callbacks_ = {}; 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu/** 9375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * Path of a worker script. 9385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * @type {string} 9395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * @const 9405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu */ 9415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuContentProvider.WORKER_SCRIPT = 9425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 'chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj/' + 9435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 'foreground/js/metadata/metadata_dispatcher.js'; 9445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentProvider.prototype = { 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __proto__: MetadataProvider.prototype 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 9505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {Entry} entry The entry. 9515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @return {boolean} Whether this provider supports the entry. 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ContentProvider.prototype.supportsEntry = function(entry) { 9545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return entry.toURL().match(this.urlFilter_); 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} type The metadata type. 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return {boolean} Whether this provider provides this metadata. 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentProvider.prototype.providesType = function(type) { 9625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return type === 'thumbnail' || type === 'fetchedMedia' || type === 'media'; 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return {string} Unique provider id. 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentProvider.prototype.getId = function() { return 'content'; }; 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Fetches the metadata. 9725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {Entry} entry File entry. 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} type Requested metadata type. 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {function(Object)} callback Callback expects a map from metadata type 975116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * to metadata value. This callback is called asynchronously. 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ContentProvider.prototype.fetch = function(entry, type, callback) { 9785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (entry.isDirectory) { 979116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch setTimeout(callback.bind(null, {}), 0); 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) var entryURL = entry.toURL(); 9835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this.callbacks_[entryURL] = callback; 9845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this.dispatcher_.postMessage({verb: 'request', arguments: [entryURL]}); 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dispatch a message from a metadata reader to the appropriate on* method. 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {Object} event The event. 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @private 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentProvider.prototype.onMessage_ = function(event) { 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var data = event.data; 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var methodName = 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'on' + data.verb.substr(0, 1).toUpperCase() + data.verb.substr(1) + '_'; 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(methodName in this)) { 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) console.error('Unknown message from metadata reader: ' + data.verb, data); 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this[methodName].apply(this, data.arguments); 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return {boolean} Whether provider is ready. 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentProvider.prototype.isInitialized = function() { 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this.initialized_; 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handles the 'initialized' message from the metadata reader Worker. 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {Object} regexp Regexp of supported urls. 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @private 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentProvider.prototype.onInitialized_ = function(regexp) { 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.urlFilter_ = regexp; 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tests can monitor for this state with 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ExtensionTestMessageListener listener("worker-initialized"); 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ASSERT_TRUE(listener.WaitUntilSatisfied()); 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Automated tests need to wait for this, otherwise we crash in 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // browser_test cleanup because the worker process still has 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // URL requests in-flight. 102723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) util.testSendMessage('worker-initialized'); 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.initialized_ = true; 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Converts content metadata from parsers to the internal format. 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {Object} metadata The content metadata. 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {Object=} opt_result The internal metadata object ot put result in. 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return {Object!} Converted metadata. 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentProvider.ConvertContentMetadata = function(metadata, opt_result) { 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var result = opt_result || {}; 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ('thumbnailURL' in metadata) { 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metadata.thumbnailTransform = metadata.thumbnailTransform || null; 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.thumbnail = { 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url: metadata.thumbnailURL, 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transform: metadata.thumbnailTransform 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var key in metadata) { 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (metadata.hasOwnProperty(key)) { 1050cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!result.media) 1051cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) result.media = {}; 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.media[key] = metadata[key]; 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1056cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (result.media) 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.fetchedMedia = result.media; 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handles the 'result' message from the worker. 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} url File url. 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {Object} metadata The metadata. 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @private 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentProvider.prototype.onResult_ = function(url, metadata) { 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var callback = this.callbacks_[url]; 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete this.callbacks_[url]; 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback(ContentProvider.ConvertContentMetadata(metadata)); 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handles the 'error' message from the worker. 10765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {string} url File entry. 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} step Step failed. 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} error Error description. 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {Object?} metadata The metadata, if available. 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @private 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentProvider.prototype.onError_ = function(url, step, error, metadata) { 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (MetadataCache.log) // Avoid log spam by default. 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) console.warn('metadata: ' + url + ': ' + step + ': ' + error); 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metadata = metadata || {}; 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prevent asking for thumbnail again. 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metadata.thumbnailURL = ''; 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.onResult_(url, metadata); 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handles the 'log' message from the worker. 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {Array.<*>} arglist Log arguments. 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @private 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentProvider.prototype.onLog_ = function(arglist) { 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (MetadataCache.log) // Avoid log spam by default. 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) console.log.apply(console, ['metadata:'].concat(arglist)); 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1100