diff options
author | hirono <hirono@chromium.org> | 2015-02-03 21:51:53 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-02-04 05:53:12 +0000 |
commit | 148b6553115ae85d87d7c82b8fe3725cba21b3c1 (patch) | |
tree | 616f3f737b535fe335ee51491884af6bacc8d797 /ui | |
parent | 13d5f845e78f390c60240de4ca6a04486749c511 (diff) | |
download | chromium_src-148b6553115ae85d87d7c82b8fe3725cba21b3c1.zip chromium_src-148b6553115ae85d87d7c82b8fe3725cba21b3c1.tar.gz chromium_src-148b6553115ae85d87d7c82b8fe3725cba21b3c1.tar.bz2 |
Files.app: Add ExternalMetadataProvider class.
It provides metadata from fileManagerPrivate.getEntriesProperty.
BUG=453242
TEST=FileManagerJsTest.ExternalMetadataProvider
Review URL: https://codereview.chromium.org/895873002
Cr-Commit-Position: refs/heads/master@{#314508}
Diffstat (limited to 'ui')
4 files changed, 178 insertions, 0 deletions
diff --git a/ui/file_manager/file_manager/foreground/js/compiled_resources.gyp b/ui/file_manager/file_manager/foreground/js/compiled_resources.gyp index d09cf7b..65288bf 100644 --- a/ui/file_manager/file_manager/foreground/js/compiled_resources.gyp +++ b/ui/file_manager/file_manager/foreground/js/compiled_resources.gyp @@ -85,6 +85,7 @@ './gear_menu_controller.js', './import_controller.js', './launch_param.js', + './metadata/external_metadata_provider.js', './metadata/file_system_metadata_provider.js', './metadata/metadata_cache.js', './metadata/metadata_cache_item.js', diff --git a/ui/file_manager/file_manager/foreground/js/metadata/external_metadata_provider.js b/ui/file_manager/file_manager/foreground/js/metadata/external_metadata_provider.js new file mode 100644 index 0000000..f2473b5 --- /dev/null +++ b/ui/file_manager/file_manager/foreground/js/metadata/external_metadata_provider.js @@ -0,0 +1,111 @@ +// 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. + +/** + * @typedef {{ + * size: number, + * shared: (boolean|undefined), + * modificationTime: Date, + * thumbnailUrl: (string|undefined), + * externalFileUrl: (string|undefined), + * imageWidth: (number|undefined), + * imageHeight: (number|undefined), + * imageRotation: (number|undefined), + * pinned: (boolean|undefined), + * present: (boolean|undefined), + * hosted: (boolean|undefined), + * dirty: (boolean|undefined), + * availableOffline: (boolean|undefined), + * availableWhenMetered: (boolean|undefined), + * customIconUrl: string, + * contentMimeType: string, + * sharedWithMe: (boolean|undefined) + * }} + */ +var ExternalMetadata; + +/** + * Metadata provider for FileEntry#getMetadata. + * + * @param {!MetadataProviderCache} cache + * @constructor + * @extends {NewMetadataProvider<!ExternalMetadata>} + * @struct + */ +function ExternalMetadataProvider(cache) { + NewMetadataProvider.call(this, cache, [ + 'availableOffline', + 'availableWhenMetered', + 'contentMimeType', + 'customIconUrl', + 'dirty', + 'externalFileUrl', + 'hosted', + 'imageHeight', + 'imageRotation', + 'imageWidth', + 'modificationTime', + 'pinned', + 'present', + 'shared', + 'sharedWithMe', + 'size', + 'thumbnailUrl' + ]); +} + +ExternalMetadataProvider.prototype.__proto__ = NewMetadataProvider.prototype; + +/** + * @override + */ +ExternalMetadataProvider.prototype.getImpl = function(requests) { + return new Promise(function(fulfill, reject) { + var urls = []; + for (var i = 0; i < requests.length; i++) { + urls.push(requests[i].entry.toURL()); + } + chrome.fileManagerPrivate.getEntryProperties( + urls, + function(results) { + if (!chrome.runtime.lastError) + fulfill(this.convertResults_(requests, results)); + else + reject(chrome.runtime.lastError); + }.bind(this)); + }.bind(this)); +}; + +/** + * @param {!Array<!MetadataRequest>} requests + * @param {!Array<!EntryProperties>} propertiesList + * @return {!Array<!ExternalMetadata>} + */ +ExternalMetadataProvider.prototype.convertResults_ = + function(requests, propertiesList) { + var results = []; + for (var i = 0; i < propertiesList.length; i++) { + var properties = propertiesList[i]; + results.push({ + availableOffline: properties.isAvailableOffline, + availableWhenMetered: properties.isAvailableWhenMetered, + contentMimeType: properties.contentMimeType || '', + customIconUrl: properties.customIconUrl || '', + dirty: properties.isDirty, + externalFileUrl: properties.externalFileUrl, + hosted: properties.isHosted, + imageHeight: properties.imageHeight, + imageRotation: properties.imageRotation, + imageWidth: properties.imageWidth, + modificationTime: new Date(properties.lastModifiedTime), + pinned: properties.isPinned, + present: properties.isPresent, + shared: properties.shared, + sharedWithMe: properties.sharedWithMe, + size: requests[i].entry.isFile ? (properties.fileSize || 0) : -1, + thumbnailUrl: properties.thumbnailUrl + }); + } + return results; +}; diff --git a/ui/file_manager/file_manager/foreground/js/metadata/external_metadata_provider_unittest.html b/ui/file_manager/file_manager/foreground/js/metadata/external_metadata_provider_unittest.html new file mode 100644 index 0000000..c03656c --- /dev/null +++ b/ui/file_manager/file_manager/foreground/js/metadata/external_metadata_provider_unittest.html @@ -0,0 +1,17 @@ +<!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="metadata_cache_item.js"></script> +<script src="external_metadata_provider.js"></script> + +<script src="external_metadata_provider_unittest.js"></script> diff --git a/ui/file_manager/file_manager/foreground/js/metadata/external_metadata_provider_unittest.js b/ui/file_manager/file_manager/foreground/js/metadata/external_metadata_provider_unittest.js new file mode 100644 index 0000000..2cb8e7a --- /dev/null +++ b/ui/file_manager/file_manager/foreground/js/metadata/external_metadata_provider_unittest.js @@ -0,0 +1,49 @@ +// 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"; }, + isFile: true +}; + +var entryB = { + toURL: function() { return "filesystem://B"; }, + isFile: true +}; + +function testExternalMetadataProviderBasic(callback) { + // Mocking chrome API. + window.chrome = { + fileManagerPrivate: { + getEntryProperties: function(urls, callback) { + assertEquals('filesystem://A', urls[0]); + assertEquals('filesystem://B', urls[1]); + callback([{ + lastModifiedTime: new Date(2015, 0, 1).getTime(), + fileSize: 1024 + }, { + lastModifiedTime: new Date(2015, 1, 2).getTime(), + fileSize: 2048 + }]); + } + }, + runtime: {lastError: null} + }; + var cache = new MetadataProviderCache(); + var provider = new ExternalMetadataProvider(cache); + reportPromise(provider.get( + [entryA, entryB], + ['modificationTime', 'size']).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); +} |