Commit c597cef3 authored by hirono's avatar hirono Committed by Commit bot

Files.app: Use new metadata models in DirectoryModel.

The CL adds new metadata model to DirectoryModel, and let DirectoryModel call the new metadata model's method to notify change of Entry.

BUG=410766
TEST=None

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

Cr-Commit-Position: refs/heads/master@{#314988}
parent 915a1a46
......@@ -150,7 +150,7 @@ IN_PROC_BROWSER_TEST_F(FileManagerJsTest, ContentMetadataProvider) {
"foreground/js/metadata/content_metadata_provider_unittest.html")));
}
IN_PROC_BROWSER_TEST_F(FileManagerJsTest, FileSystemMetadataModel) {
IN_PROC_BROWSER_TEST_F(FileManagerJsTest, FileSystemMetadata) {
RunTest(base::FilePath(FILE_PATH_LITERAL(
"foreground/js/metadata/file_system_metadata_model_unittest.html")));
"foreground/js/metadata/file_system_metadata_unittest.html")));
}
......@@ -87,7 +87,7 @@
'./launch_param.js',
'./metadata/content_metadata_provider.js',
'./metadata/external_metadata_provider.js',
'./metadata/file_system_metadata_model.js',
'./metadata/file_system_metadata.js',
'./metadata/file_system_metadata_provider.js',
'./metadata/metadata_cache.js',
'./metadata/metadata_cache_item.js',
......
......@@ -16,13 +16,16 @@ var SHORT_RESCAN_INTERVAL = 100;
* @param {FileFilter} fileFilter Instance of FileFilter.
* @param {FileWatcher} fileWatcher Instance of FileWatcher.
* @param {MetadataCache} metadataCache The metadata cache service.
* @param {!FileSystemMetadata} fileSystemMetadata The metadata cache
* service.
* @param {VolumeManagerWrapper} volumeManager The volume manager.
* @param {!FileOperationManager} fileOperationManager File operation manager.
* @constructor
* @extends {cr.EventTarget}
*/
function DirectoryModel(singleSelection, fileFilter, fileWatcher,
metadataCache, volumeManager, fileOperationManager) {
function DirectoryModel(singleSelection, fileFilter, fileWatcher, metadataCache,
fileSystemMetadata, volumeManager,
fileOperationManager) {
this.fileListSelection_ = singleSelection ?
new cr.ui.ListSingleSelectionModel() : new cr.ui.ListSelectionModel();
......@@ -46,6 +49,7 @@ function DirectoryModel(singleSelection, fileFilter, fileWatcher,
DirectoryContents.createForDirectory(this.currentFileListContext_, null);
this.metadataCache_ = metadataCache;
this.fileSystemMetadata_ = fileSystemMetadata;
this.volumeManager_ = volumeManager;
this.volumeManager_.volumeInfoList.addEventListener(
......@@ -821,6 +825,7 @@ DirectoryModel.prototype.createDirectory = function(name,
return;
}
var dirContents = this.currentDirContents_;
var sequence = this.changeDirectorySequence_;
new Promise(entry.getDirectory.bind(
......@@ -829,10 +834,10 @@ DirectoryModel.prototype.createDirectory = function(name,
then(function(newEntry) {
// Refresh the cache.
this.metadataCache_.clear([newEntry], '*');
this.fileSystemMetadata_.notifyEntryCreated([newEntry]);
return new Promise(function(onFulfilled, onRejected) {
this.metadataCache_.getOne(newEntry,
'filesystem',
onFulfilled.bind(null, newEntry));
dirContents.prefetchMetadata(
[newEntry], false, onFulfilled.bind(null, newEntry));
}.bind(this));
}.bind(this)).
......
......@@ -60,6 +60,17 @@ function FileManager() {
*/
this.metadataCache_ = null;
/**
* @private {!MetadataProviderCache}
* @const
*/
this.metadataProviderCache_ = new MetadataProviderCache();
/**
* @private {FileSystemMetadata}
*/
this.fileSystemMetadata_ = null;
/**
* File operation manager.
* @type {FileOperationManager}
......@@ -680,7 +691,13 @@ FileManager.prototype = /** @struct */ {
DialogType.FULL_PAGE]);
// Create the metadata cache.
assert(this.volumeManager_);
this.metadataCache_ = MetadataCache.createFull(this.volumeManager_);
this.fileSystemMetadata_ = new FileSystemMetadata(
this.metadataProviderCache_,
new FileSystemMetadataProvider(this.metadataProviderCache_),
new ExternalMetadataProvider(this.metadataProviderCache_),
this.volumeManager_);
// Create the root view of FileManager.
assert(this.dialogDom_);
......@@ -824,11 +841,13 @@ FileManager.prototype = /** @struct */ {
assert(this.volumeManager_);
assert(this.fileOperationManager_);
assert(this.fileSystemMetadata_);
this.directoryModel_ = new DirectoryModel(
singleSelection,
this.fileFilter_,
this.fileWatcher_,
this.metadataCache_,
this.fileSystemMetadata_,
this.volumeManager_,
this.fileOperationManager_);
......
......@@ -82,6 +82,8 @@
//<include src="ui/combobutton.js">
//<include src="ui/commandbutton.js">
//<include src="ui/file_manager_dialog_base.js">
//<include src="metadata/metadata_cache_set.js">
//<include src="metadata/new_metadata_provider.js">
//
//<include src="app_installer.js">
//<include src="app_state_controller.js">
......@@ -100,7 +102,11 @@
//<include src="gear_menu_controller.js">
//<include src="import_controller.js">
//<include src="launch_param.js">
//<include src="metadata/external_metadata_provider.js">
//<include src="metadata/file_system_metadata.js">
//<include src="metadata/file_system_metadata_provider.js">
//<include src="metadata/metadata_cache.js">
//<include src="metadata/metadata_cache_item.js">
//<include src="metadata_update_controller.js">
//<include src="naming_controller.js">
//<include src="navigation_list_model.js">
......
......@@ -23,14 +23,14 @@
* sharedWithMe: (boolean|undefined)
* }}
*/
var ExternalMetadata;
var ExternalMetadataProperties;
/**
* Metadata provider for FileEntry#getMetadata.
*
* @param {!MetadataProviderCache} cache
* @constructor
* @extends {NewMetadataProvider<!ExternalMetadata>}
* @extends {NewMetadataProvider<!ExternalMetadataProperties>}
* @struct
*/
function ExternalMetadataProvider(cache) {
......@@ -80,7 +80,7 @@ ExternalMetadataProvider.prototype.getImpl = function(requests) {
/**
* @param {!Array<!MetadataRequest>} requests
* @param {!Array<!EntryProperties>} propertiesList
* @return {!Array<!ExternalMetadata>}
* @return {!Array<!ExternalMetadataProperties>}
*/
ExternalMetadataProvider.prototype.convertResults_ =
function(requests, propertiesList) {
......
......@@ -10,7 +10,7 @@
* @constructor
* @struct
*/
function FileSystemMetadataModel(
function FileSystemMetadata(
cache,
fileSystemMetadataProvider,
externalMetadataProvider,
......@@ -44,9 +44,9 @@ function FileSystemMetadataModel(
* Obtains metadata for entries.
* @param {!Array<!FileEntry>} entries Entries.
* @param {!Array<string>} names Metadata property names to be obtained.
* @return {!Promise<!Array<!ExternalMetadata>>}
* @return {!Promise<!Array<!ExternalMetadataProperties>>}
*/
FileSystemMetadataModel.prototype.get = function(entries, names) {
FileSystemMetadata.prototype.get = function(entries, names) {
var localEntries = [];
var localEntryIndexes = [];
var externalEntries = [];
......@@ -85,8 +85,16 @@ FileSystemMetadataModel.prototype.get = function(entries, names) {
* Obtains metadata cache for entries.
* @param {!Array<!FileEntry>} entries Entries.
* @param {!Array<string>} names Metadata property names to be obtained.
* @return {!Array<!FileSystemMetadata>}
* @return {!Array<!ExternalMetadataProperties>}
*/
FileSystemMetadataModel.prototype.getCache = function(entries, names) {
FileSystemMetadata.prototype.getCache = function(entries, names) {
return this.cache_.get(entries, names);
};
/**
* Clears old metadata for newly created entries.
* @param {!Array<!FileEntry>} entries
*/
FileSystemMetadata.prototype.notifyEntryCreated = function(entries) {
this.cache_.clear(entries);
};
......@@ -5,14 +5,14 @@
/**
* @typedef {{modificationTime:Date, size:number}}
*/
var FileSystemMetadata;
var FileSystemMetadataProperties;
/**
* Metadata provider for FileEntry#getMetadata.
*
* @param {!MetadataProviderCache} cache
* @constructor
* @extends {NewMetadataProvider<!FileSystemMetadata>}
* @extends {NewMetadataProvider<!FileSystemMetadataProperties>}
* @struct
*/
function FileSystemMetadataProvider(cache) {
......
......@@ -13,8 +13,8 @@
<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.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>
<script src="file_system_metadata_unittest.js"></script>
......@@ -10,9 +10,9 @@ var entryB = {
toURL: function() { return 'filesystem://B'; }
};
function testFileSystemMetadataModelBasic(callback) {
function testFileSystemMetadataBasic(callback) {
var cache = new MetadataProviderCache();
var model = new FileSystemMetadataModel(
var model = new FileSystemMetadata(
cache,
// Mocking FileSystemMetadataProvider.
{
......
......@@ -102,6 +102,16 @@ MetadataCacheSet.prototype.invalidate = function(requestId, entries) {
}
};
/**
* Clears the caches of entries.
* @param {!Array<!FileEntry>} entries
*/
MetadataCacheSet.prototype.clear = function(entries) {
for (var i = 0; i < entries.length; i++) {
this.items_.remove(entries[i].toURL());
}
};
/**
* Creates snapshot of the cache for entries.
* @param {!Array<!FileEntry>} entries
......@@ -161,6 +171,12 @@ MetadataCacheSetStorage.prototype.peek = function(url) {};
*/
MetadataCacheSetStorage.prototype.put = function(url, item) {};
/**
* Removes an item from the cache.
* @param {string} url Entry URL.
*/
MetadataCacheSetStorage.prototype.remove = function(url) {};
/**
* Implementation of MetadataCacheSetStorage by using raw object.
* @param {Object} items Map of URL and MetadataCacheItem.
......@@ -193,6 +209,13 @@ MetadataCacheSetStorageForObject.prototype.put = function(url, item) {
this.items_[url] = item;
};
/**
* @override
*/
MetadataCacheSetStorageForObject.prototype.remove = function(url) {
delete this.items_[url];
};
/**
* Implementation of MetadataCacheSetStorage by using LRUCache.
* @param {!LRUCache<!MetadataCacheItem>} cache LRUCache.
......@@ -229,6 +252,13 @@ MetadataCacheSetStorageForLRUCache.prototype.put = function(url, item) {
this.cache_.put(url, item);
};
/**
* @override
*/
MetadataCacheSetStorageForLRUCache.prototype.remove = function(url) {
this.cache_.remove(url);
};
/**
* @param {!FileEntry} entry Entry
* @param {!Array<string>} names Property name list to be requested.
......
......@@ -122,3 +122,18 @@ function testMetadataCacheSetHasFreshCache() {
assertTrue(set.hasFreshCache([entryA], ['property']));
}
function testMetadataCacheSetClear() {
var set = new MetadataCacheSet(new MetadataCacheSetStorageForObject({}));
set.startRequests(1, set.createRequests([entryA], ['propertyA']));
set.storeProperties(1, [entryA], [{propertyA: 'value'}]);
assertTrue(set.hasFreshCache([entryA], ['propertyA']));
set.startRequests(1, set.createRequests([entryA], ['propertyB']));
set.clear([entryA]);
// PropertyB should not be stored because it is requsted before clear.
set.storeProperties(1, [entryA], [{propertyB: 'value'}]);
assertFalse(set.hasFreshCache([entryA], ['propertyA']));
assertFalse(set.hasFreshCache([entryA], ['propertyB']));
}
......@@ -103,6 +103,8 @@
<script src="foreground/js/ui/combobutton.js"></script>
<script src="foreground/js/ui/commandbutton.js"></script>
<script src="foreground/js/ui/file_manager_dialog_base.js"></script>
<script src="metadata/metadata_cache_set.js"></script>
<script src="metadata/new_metadata_provider.js"></script>
<script src="foreground/js/app_installer.js"></script>
<script src="foreground/js/app_state_controller.js"></script>
......@@ -121,7 +123,11 @@
<script src="foreground/js/gear_menu_controller.js"></script>
<script src="foreground/js/import_controller.js"></script>
<script src="foreground/js/launch_param.js"></script>
<script src="foreground/js/metadata/external_metadata_provider.js"></script>
<script src="foreground/js/metadata/file_system_metadata.js"></script>
<script src="foreground/js/metadata/file_system_metadata_provider.js"></script>
<script src="foreground/js/metadata/metadata_cache.js"></script>
<script src="foreground/js/metadata/metadata_cache_item.js"></script>
<script src="foreground/js/metadata_update_controller.js"></script>
<script src="foreground/js/naming_controller.js"></script>
<script src="foreground/js/navigation_list_model.js"></script>
......
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