Commit 40f480c3 authored by fukino@chromium.org's avatar fukino@chromium.org

Ensure that the callback for MetadataCache.getOne() is called asynchronously.

BUG=394788
TEST=manually tested

Review URL: https://codereview.chromium.org/400703002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@284053 0039d316-1c4b-4281-b951-d872f2087c98
parent 46091e02
...@@ -199,9 +199,10 @@ MetadataCache.prototype.currentEvictionThreshold_ = function() { ...@@ -199,9 +199,10 @@ MetadataCache.prototype.currentEvictionThreshold_ = function() {
* @param {Array.<Entry>} entries The list of entries. * @param {Array.<Entry>} entries The list of entries.
* @param {string} type The metadata type. * @param {string} type The metadata type.
* @param {function(Object)} callback The metadata is passed to callback. * @param {function(Object)} callback The metadata is passed to callback.
* The callback is called asynchronously.
*/ */
MetadataCache.prototype.get = function(entries, type, callback) { MetadataCache.prototype.get = function(entries, type, callback) {
return this.getInternal_(entries, type, false, callback); this.getInternal_(entries, type, false, callback);
}; };
/** /**
...@@ -211,9 +212,10 @@ MetadataCache.prototype.get = function(entries, type, callback) { ...@@ -211,9 +212,10 @@ MetadataCache.prototype.get = function(entries, type, callback) {
* @param {Array.<Entry>} entries The list of entries. * @param {Array.<Entry>} entries The list of entries.
* @param {string} type The metadata type. * @param {string} type The metadata type.
* @param {function(Object)} callback The metadata is passed to callback. * @param {function(Object)} callback The metadata is passed to callback.
* The callback is called asynchronously.
*/ */
MetadataCache.prototype.getLatest = function(entries, type, callback) { MetadataCache.prototype.getLatest = function(entries, type, callback) {
return this.getInternal_(entries, type, true, callback); this.getInternal_(entries, type, true, callback);
}; };
/** /**
...@@ -224,11 +226,12 @@ MetadataCache.prototype.getLatest = function(entries, type, callback) { ...@@ -224,11 +226,12 @@ MetadataCache.prototype.getLatest = function(entries, type, callback) {
* @param {boolean} refresh True to get the latest value and refresh the cache, * @param {boolean} refresh True to get the latest value and refresh the cache,
* false to get the value from the cache. * false to get the value from the cache.
* @param {function(Object)} callback The metadata is passed to callback. * @param {function(Object)} callback The metadata is passed to callback.
* The callback is called asynchronously.
*/ */
MetadataCache.prototype.getInternal_ = MetadataCache.prototype.getInternal_ =
function(entries, type, refresh, callback) { function(entries, type, refresh, callback) {
if (entries.length === 0) { if (entries.length === 0) {
if (callback) callback([]); if (callback) setTimeout(callback.bind(null, []), 0);
return; return;
} }
...@@ -241,7 +244,7 @@ MetadataCache.prototype.getInternal_ = ...@@ -241,7 +244,7 @@ MetadataCache.prototype.getInternal_ =
remaining--; remaining--;
if (remaining === 0) { if (remaining === 0) {
this.endBatchUpdates(); this.endBatchUpdates();
if (callback) setTimeout(callback, 0, result); if (callback) callback(result);
} }
}; };
...@@ -256,12 +259,14 @@ MetadataCache.prototype.getInternal_ = ...@@ -256,12 +259,14 @@ MetadataCache.prototype.getInternal_ =
/** /**
* Fetches the metadata for one Entry. See comments to |get|. * Fetches the metadata for one Entry. See comments to |get|.
*
* @param {Entry} entry The entry. * @param {Entry} entry The entry.
* @param {string} type Metadata type. * @param {string} type Metadata type.
* @param {function(Object)} callback The callback. * @param {function(Object)} callback The metadata is passed to callback.
* The callback is called asynchronously.
*/ */
MetadataCache.prototype.getOne = function(entry, type, callback, refresh) { MetadataCache.prototype.getOne = function(entry, type, callback, refresh) {
return this.getOneInternal_(entry, type, false, callback); this.getOneInternal_(entry, type, false, callback);
}; };
/** /**
...@@ -271,7 +276,8 @@ MetadataCache.prototype.getOne = function(entry, type, callback, refresh) { ...@@ -271,7 +276,8 @@ MetadataCache.prototype.getOne = function(entry, type, callback, refresh) {
* @param {string} type Metadata type. * @param {string} type Metadata type.
* @param {boolean} refresh True to get the latest value and refresh the cache, * @param {boolean} refresh True to get the latest value and refresh the cache,
* false to get the value from the cache. * false to get the value from the cache.
* @param {function(Object)} callback The callback. * @param {function(Object)} callback The metadata is passed to callback.
* The callback is called asynchronously.
* @private * @private
*/ */
MetadataCache.prototype.getOneInternal_ = MetadataCache.prototype.getOneInternal_ =
...@@ -306,7 +312,7 @@ MetadataCache.prototype.getOneInternal_ = ...@@ -306,7 +312,7 @@ MetadataCache.prototype.getOneInternal_ =
if (!refresh && type in item.properties) { if (!refresh && type in item.properties) {
// Uses cache, if available and not on the 'refresh' mode. // Uses cache, if available and not on the 'refresh' mode.
callback(item.properties[type]); setTimeout(callback.bind(null, item.properties[type]), 0);
return; return;
} }
...@@ -354,7 +360,7 @@ MetadataCache.prototype.getOneInternal_ = ...@@ -354,7 +360,7 @@ MetadataCache.prototype.getOneInternal_ =
var tryNextProvider = function() { var tryNextProvider = function() {
if (providers.length === 0) { if (providers.length === 0) {
self.endBatchUpdates(); self.endBatchUpdates();
callback(item.properties[type] || null); setTimeout(callback.bind(null, item.properties[type] || null), 0);
return; return;
} }
...@@ -684,7 +690,7 @@ MetadataProvider.prototype.isInitialized = function() { return true; }; ...@@ -684,7 +690,7 @@ MetadataProvider.prototype.isInitialized = function() { return true; };
* @param {Entry} entry File entry. * @param {Entry} entry File entry.
* @param {string} type Requested metadata type. * @param {string} type Requested metadata type.
* @param {function(Object)} callback Callback expects a map from metadata type * @param {function(Object)} callback Callback expects a map from metadata type
* to metadata value. * to metadata value. This callback must be called asynchronously.
*/ */
MetadataProvider.prototype.fetch = function(entry, type, callback) { MetadataProvider.prototype.fetch = function(entry, type, callback) {
throw new Error('Default metadata provider cannot fetch.'); throw new Error('Default metadata provider cannot fetch.');
...@@ -731,7 +737,7 @@ FilesystemProvider.prototype.getId = function() { return 'filesystem'; }; ...@@ -731,7 +737,7 @@ FilesystemProvider.prototype.getId = function() { return 'filesystem'; };
* @param {Entry} entry File entry. * @param {Entry} entry File entry.
* @param {string} type Requested metadata type. * @param {string} type Requested metadata type.
* @param {function(Object)} callback Callback expects a map from metadata type * @param {function(Object)} callback Callback expects a map from metadata type
* to metadata value. * to metadata value. This callback is called asynchronously.
*/ */
FilesystemProvider.prototype.fetch = function( FilesystemProvider.prototype.fetch = function(
entry, type, callback) { entry, type, callback) {
...@@ -809,7 +815,7 @@ DriveProvider.prototype.getId = function() { return 'drive'; }; ...@@ -809,7 +815,7 @@ DriveProvider.prototype.getId = function() { return 'drive'; };
* @param {Entry} entry File entry. * @param {Entry} entry File entry.
* @param {string} type Requested metadata type. * @param {string} type Requested metadata type.
* @param {function(Object)} callback Callback expects a map from metadata type * @param {function(Object)} callback Callback expects a map from metadata type
* to metadata value. * to metadata value. This callback is called asynchronously.
*/ */
DriveProvider.prototype.fetch = function(entry, type, callback) { DriveProvider.prototype.fetch = function(entry, type, callback) {
this.entries_.push(entry); this.entries_.push(entry);
...@@ -994,11 +1000,11 @@ ContentProvider.prototype.getId = function() { return 'content'; }; ...@@ -994,11 +1000,11 @@ ContentProvider.prototype.getId = function() { return 'content'; };
* @param {Entry} entry File entry. * @param {Entry} entry File entry.
* @param {string} type Requested metadata type. * @param {string} type Requested metadata type.
* @param {function(Object)} callback Callback expects a map from metadata type * @param {function(Object)} callback Callback expects a map from metadata type
* to metadata value. * to metadata value. This callback is called asynchronously.
*/ */
ContentProvider.prototype.fetch = function(entry, type, callback) { ContentProvider.prototype.fetch = function(entry, type, callback) {
if (entry.isDirectory) { if (entry.isDirectory) {
callback({}); setTimeout(callback.bind(null, {}), 0);
return; return;
} }
var entryURL = entry.toURL(); var entryURL = entry.toURL();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment