diff options
author | hirono <hirono@chromium.org> | 2015-02-05 00:24:48 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-02-05 08:25:47 +0000 |
commit | 6e88a1fd53c12f3d448b26bb4754b55ae3fb2d70 (patch) | |
tree | 4f8efd2667a31bcef1da57ed7a7b5e58ef840779 /ui | |
parent | c5d93145ccc97b697f0decde9fa10267998e40f4 (diff) | |
download | chromium_src-6e88a1fd53c12f3d448b26bb4754b55ae3fb2d70.zip chromium_src-6e88a1fd53c12f3d448b26bb4754b55ae3fb2d70.tar.gz chromium_src-6e88a1fd53c12f3d448b26bb4754b55ae3fb2d70.tar.bz2 |
Files.app: Do not update cached MetadataCachedItemProperty before it is invalidated.
BUG=410766
TEST=FileManagerJsTest.MetadataCacheItem
Review URL: https://codereview.chromium.org/900173002
Cr-Commit-Position: refs/heads/master@{#314777}
Diffstat (limited to 'ui')
3 files changed, 48 insertions, 1 deletions
diff --git a/ui/file_manager/file_manager/foreground/js/metadata/metadata_cache_item.js b/ui/file_manager/file_manager/foreground/js/metadata/metadata_cache_item.js index 663320f..1efae04 100644 --- a/ui/file_manager/file_manager/foreground/js/metadata/metadata_cache_item.js +++ b/ui/file_manager/file_manager/foreground/js/metadata/metadata_cache_item.js @@ -62,8 +62,11 @@ MetadataCacheItem.prototype.storeProperties = function(requestId, object) { for (var name in object) { if (!this.properties_[name]) this.properties_[name] = new MetadataCacheItemProperty(); - if (requestId < this.properties_[name].requestId) + if (requestId < this.properties_[name].requestId || + this.properties_[name].state === + MetadataCacheItemPropertyState.FULFILLED) { continue; + } changed = true; this.properties_[name].requestId = requestId; this.properties_[name].value = object[name]; diff --git a/ui/file_manager/file_manager/foreground/js/metadata/metadata_cache_item_unittest.js b/ui/file_manager/file_manager/foreground/js/metadata/metadata_cache_item_unittest.js index ca30f5f..4a5a04a 100644 --- a/ui/file_manager/file_manager/foreground/js/metadata/metadata_cache_item_unittest.js +++ b/ui/file_manager/file_manager/foreground/js/metadata/metadata_cache_item_unittest.js @@ -80,3 +80,11 @@ function testMetadataCacheItemHasFreshCache() { assertFalse(item.hasFreshCache(['propertyA', 'propertyB'])); assertTrue(item.hasFreshCache(['propertyA'])); } + +function testMetadataCacheShouldNotUpdateBeforeInvalidation() { + var item = new MetadataCacheItem(); + item.startRequests(1, item.createRequests(['property'])); + item.storeProperties(1, {property: 'value1'}); + item.storeProperties(2, {property: 'value2'}); + assertEquals('value1', item.get(['property']).property); +} diff --git a/ui/file_manager/file_manager/foreground/js/metadata/new_metadata_provider_unittest.js b/ui/file_manager/file_manager/foreground/js/metadata/new_metadata_provider_unittest.js index be81c33..54cda9f 100644 --- a/ui/file_manager/file_manager/foreground/js/metadata/new_metadata_provider_unittest.js +++ b/ui/file_manager/file_manager/foreground/js/metadata/new_metadata_provider_unittest.js @@ -34,6 +34,20 @@ TestEmptyMetadataProvider.prototype.getImpl = function(requests) { })); }; +function ManualTestMetadataProvider(cache) { + NewMetadataProvider.call( + this, cache, ['propertyA', 'propertyB', 'propertyC']); + this.callback = []; +} + +ManualTestMetadataProvider.prototype.__proto__ = NewMetadataProvider.prototype; + +ManualTestMetadataProvider.prototype.getImpl = function(requests) { + return new Promise(function(fulfill) { + this.callback.push(fulfill); + }.bind(this)); +}; + var entryA = { toURL: function() { return "filesystem://A"; } }; @@ -113,6 +127,28 @@ function testNewMetadataProviderRequestBeforeCompletingPreviousRequest( }), callback); } +function testNewMetadataProviderNotUpdateCachedResultAfterRequest( + callback) { + var cache = new MetadataProviderCache(); + var provider = new ManualTestMetadataProvider(cache); + var promise = provider.get([entryA], ['propertyA']); + provider.callback[0]([{propertyA: 'valueA1'}]); + reportPromise(promise.then(function() { + // 'propertyA' is cached here. + var promise1 = provider.get([entryA], ['propertyA', 'propertyB']); + var promise2 = provider.get([entryA], ['propertyC']); + // Returns propertyC. + provider.callback[2]([{propertyA: 'valueA2', propertyC: 'valueC'}]); + provider.callback[1]([{propertyB: 'valueB'}]); + return Promise.all([promise1, promise2]); + }).then(function(results) { + // The result should be cached value at the time when get was called. + assertEquals('valueA1', results[0][0].propertyA); + assertEquals('valueB', results[0][0].propertyB); + assertEquals('valueC', results[1][0].propertyC); + }), callback); +} + function testNewMetadataProviderGetCache(callback) { var cache = new MetadataProviderCache(); var provider = new TestMetadataProvider(cache); |