Commit 7602e721 authored by hirono's avatar hirono Committed by Commit bot

Files.app: Add FileSystemMetadataModel.

The model dispatches the requests depends on the entry's location.

BUG=410766
TEST=FileManagerJsTest.FileSystemMetadataModel

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

Cr-Commit-Position: refs/heads/master@{#314965}
parent e6c6db7d
...@@ -149,3 +149,8 @@ IN_PROC_BROWSER_TEST_F(FileManagerJsTest, ContentMetadataProvider) { ...@@ -149,3 +149,8 @@ IN_PROC_BROWSER_TEST_F(FileManagerJsTest, ContentMetadataProvider) {
RunTest(base::FilePath(FILE_PATH_LITERAL( RunTest(base::FilePath(FILE_PATH_LITERAL(
"foreground/js/metadata/content_metadata_provider_unittest.html"))); "foreground/js/metadata/content_metadata_provider_unittest.html")));
} }
IN_PROC_BROWSER_TEST_F(FileManagerJsTest, FileSystemMetadataModel) {
RunTest(base::FilePath(FILE_PATH_LITERAL(
"foreground/js/metadata/file_system_metadata_model_unittest.html")));
}
...@@ -87,6 +87,7 @@ ...@@ -87,6 +87,7 @@
'./launch_param.js', './launch_param.js',
'./metadata/content_metadata_provider.js', './metadata/content_metadata_provider.js',
'./metadata/external_metadata_provider.js', './metadata/external_metadata_provider.js',
'./metadata/file_system_metadata_model.js',
'./metadata/file_system_metadata_provider.js', './metadata/file_system_metadata_provider.js',
'./metadata/metadata_cache.js', './metadata/metadata_cache.js',
'./metadata/metadata_cache_item.js', './metadata/metadata_cache_item.js',
......
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* @param {!MetadataProviderCache} cache
* @param {!FileSystemMetadataProvider} fileSystemMetadataProvider
* @param {!ExternalMetadataProvider} externalMetadataProvider
* @param {!VolumeManagerWrapper} volumeManager
* @constructor
* @struct
*/
function FileSystemMetadataModel(
cache,
fileSystemMetadataProvider,
externalMetadataProvider,
volumeManager) {
/**
* @private {!MetadataProviderCache}
* @const
*/
this.cache_ = cache;
/**
* @private {!FileSystemMetadataProvider}
* @const
*/
this.fileSystemMetadataProvider_ = fileSystemMetadataProvider;
/**
* @private {!ExternalMetadataProvider}
* @const
*/
this.externalMetadataProvider_ = externalMetadataProvider;
/**
* @private {!VolumeManagerWrapper}
* @const
*/
this.volumeManager_ = volumeManager;
}
/**
* Obtains metadata for entries.
* @param {!Array<!FileEntry>} entries Entries.
* @param {!Array<string>} names Metadata property names to be obtained.
* @return {!Promise<!Array<!ExternalMetadata>>}
*/
FileSystemMetadataModel.prototype.get = function(entries, names) {
var localEntries = [];
var localEntryIndexes = [];
var externalEntries = [];
var externalEntryIndexes = [];
for (var i = 0; i < entries.length; i++) {
var volumeInfo = this.volumeManager_.getVolumeInfo(entries[i]);
if (volumeInfo &&
(volumeInfo.volumeType === VolumeManagerCommon.VolumeType.DRIVE ||
volumeInfo.volumeType === VolumeManagerCommon.VolumeType.PROVIDED)) {
externalEntries.push(entries[i]);
externalEntryIndexes.push(i);
} else {
localEntries.push(entries[i]);
localEntryIndexes.push(i);
}
}
return Promise.all([
this.fileSystemMetadataProvider_.get(localEntries, names),
this.externalMetadataProvider_.get(externalEntries, names)
]).then(function(results) {
var integratedResults = [];
var localResults = results[0];
for (var i = 0; i < localResults.length; i++) {
integratedResults[localEntryIndexes[i]] = localResults[i];
}
var externalResults = results[1];
for (var i = 0; i < externalResults.length; i++) {
integratedResults[externalEntryIndexes[i]] = externalResults[i];
}
return integratedResults;
});
};
/**
* Obtains metadata cache for entries.
* @param {!Array<!FileEntry>} entries Entries.
* @param {!Array<string>} names Metadata property names to be obtained.
* @return {!Array<!FileSystemMetadata>}
*/
FileSystemMetadataModel.prototype.getCache = function(entries, names) {
return this.cache_.get(entries, names);
};
<!DOCTYPE html>
<!-- Copyright 2015 The Chromium Authors. All rights reserved.
-- Use of this source code is governed by a BSD-style license that can be
-- found in the LICENSE file.
-->
<!-- Base classes -->
<script src="metadata_cache_set.js"></script>
<script src="new_metadata_provider.js"></script>
<!-- Others -->
<script src="../../../../../../ui/webui/resources/js/assert.js"></script>
<script src="../../../common/js/lru_cache.js"></script>
<script src="../../../common/js/unittest_util.js"></script>
<script src="../../../common/js/volume_manager_common.js"></script>
<script src="external_metadata_provider.js"></script>
<script src="file_system_metadata_model.js"></script>
<script src="file_system_metadata_provider.js"></script>
<script src="metadata_cache_item.js"></script>
<script src="file_system_metadata_model_unittest.js"></script>
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
var entryA = {
toURL: function() { return 'filesystem://A'; }
};
var entryB = {
toURL: function() { return 'filesystem://B'; }
};
function testFileSystemMetadataModelBasic(callback) {
var cache = new MetadataProviderCache();
var model = new FileSystemMetadataModel(
cache,
// Mocking FileSystemMetadataProvider.
{
get: function(urls) {
assertEquals(1, urls.length);
assertEquals('filesystem://A', urls[0].toURL());
return Promise.resolve(
[{modificationTime: new Date(2015, 0, 1), size: 1024}]);
}
},
// Mocking ExternalMetadataProvider.
{
get: function(urls) {
assertEquals(1, urls.length);
assertEquals('filesystem://B', urls[0].toURL());
return Promise.resolve(
[{modificationTime: new Date(2015, 1, 2), size: 2048}]);
}
},
// Mocking VolumeManagerWrapper.
{
getVolumeInfo: function(entry) {
if (entry.toURL() === 'filesystem://A') {
return {
volumeType: VolumeManagerCommon.VolumeType.DOWNLOADS
};
} else if (entry.toURL() === 'filesystem://B') {
return {
volumeType: VolumeManagerCommon.VolumeType.DRIVE
};
}
assertNotReached();
}
});
reportPromise(
model.get([entryA, entryB], ['size', 'modificationTime']).then(
function(results) {
assertEquals(2, results.length);
assertEquals(
new Date(2015, 0, 1).toString(),
results[0].modificationTime.toString());
assertEquals(1024, results[0].size);
assertEquals(
new Date(2015, 1, 2).toString(),
results[1].modificationTime.toString());
assertEquals(2048, results[1].size);
}), callback);
}
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