summaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
authorhirono <hirono@chromium.org>2015-02-05 00:24:48 -0800
committerCommit bot <commit-bot@chromium.org>2015-02-05 08:25:47 +0000
commit6e88a1fd53c12f3d448b26bb4754b55ae3fb2d70 (patch)
tree4f8efd2667a31bcef1da57ed7a7b5e58ef840779 /ui
parentc5d93145ccc97b697f0decde9fa10267998e40f4 (diff)
downloadchromium_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')
-rw-r--r--ui/file_manager/file_manager/foreground/js/metadata/metadata_cache_item.js5
-rw-r--r--ui/file_manager/file_manager/foreground/js/metadata/metadata_cache_item_unittest.js8
-rw-r--r--ui/file_manager/file_manager/foreground/js/metadata/new_metadata_provider_unittest.js36
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);