Commit 6e88a1fd authored by hirono's avatar hirono Committed by Commit bot

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}
parent c5d93145
...@@ -62,8 +62,11 @@ MetadataCacheItem.prototype.storeProperties = function(requestId, object) { ...@@ -62,8 +62,11 @@ MetadataCacheItem.prototype.storeProperties = function(requestId, object) {
for (var name in object) { for (var name in object) {
if (!this.properties_[name]) if (!this.properties_[name])
this.properties_[name] = new MetadataCacheItemProperty(); this.properties_[name] = new MetadataCacheItemProperty();
if (requestId < this.properties_[name].requestId) if (requestId < this.properties_[name].requestId ||
this.properties_[name].state ===
MetadataCacheItemPropertyState.FULFILLED) {
continue; continue;
}
changed = true; changed = true;
this.properties_[name].requestId = requestId; this.properties_[name].requestId = requestId;
this.properties_[name].value = object[name]; this.properties_[name].value = object[name];
......
...@@ -80,3 +80,11 @@ function testMetadataCacheItemHasFreshCache() { ...@@ -80,3 +80,11 @@ function testMetadataCacheItemHasFreshCache() {
assertFalse(item.hasFreshCache(['propertyA', 'propertyB'])); assertFalse(item.hasFreshCache(['propertyA', 'propertyB']));
assertTrue(item.hasFreshCache(['propertyA'])); 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);
}
...@@ -34,6 +34,20 @@ TestEmptyMetadataProvider.prototype.getImpl = function(requests) { ...@@ -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 = { var entryA = {
toURL: function() { return "filesystem://A"; } toURL: function() { return "filesystem://A"; }
}; };
...@@ -113,6 +127,28 @@ function testNewMetadataProviderRequestBeforeCompletingPreviousRequest( ...@@ -113,6 +127,28 @@ function testNewMetadataProviderRequestBeforeCompletingPreviousRequest(
}), callback); }), 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) { function testNewMetadataProviderGetCache(callback) {
var cache = new MetadataProviderCache(); var cache = new MetadataProviderCache();
var provider = new TestMetadataProvider(cache); var provider = new TestMetadataProvider(cache);
......
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