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