Commit 2ca89c2b authored by François Degros's avatar François Degros Committed by Commit Bot

[Files app] ES6 class for content_metadata_provider.js

Bug: 778674
Change-Id: Ic0e6c4588bb7258a87d7817196ef554591e62e22
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1647642
Commit-Queue: François Degros <fdegros@chromium.org>
Commit-Queue: Luciano Pacheco <lucmult@chromium.org>
Auto-Submit: François Degros <fdegros@chromium.org>
Reviewed-by: default avatarLuciano Pacheco <lucmult@chromium.org>
Cr-Commit-Position: refs/heads/master@{#666614}
parent 6cb788d3
...@@ -2,15 +2,14 @@ ...@@ -2,15 +2,14 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
/** /** @final */
class ContentMetadataProvider extends MetadataProvider {
/**
* @param {!MessagePort=} opt_messagePort Message port overriding the default * @param {!MessagePort=} opt_messagePort Message port overriding the default
* worker port. * worker port.
* @extends {MetadataProvider}
* @constructor
* @struct
*/ */
function ContentMetadataProvider(opt_messagePort) { constructor(opt_messagePort) {
MetadataProvider.call(this, ContentMetadataProvider.PROPERTY_NAMES); super(ContentMetadataProvider.PROPERTY_NAMES);
/** /**
* Pass all URLs to the metadata reader until we have a correct filter. * Pass all URLs to the metadata reader until we have a correct filter.
...@@ -18,10 +17,7 @@ function ContentMetadataProvider(opt_messagePort) { ...@@ -18,10 +17,7 @@ function ContentMetadataProvider(opt_messagePort) {
*/ */
this.urlFilter_ = /.*/; this.urlFilter_ = /.*/;
/** /** @private @const {!MessagePort} */
* @private {!MessagePort}
* @const
*/
this.dispatcher_ = opt_messagePort ? this.dispatcher_ = opt_messagePort ?
opt_messagePort : opt_messagePort :
new SharedWorker(ContentMetadataProvider.WORKER_SCRIPT).port; new SharedWorker(ContentMetadataProvider.WORKER_SCRIPT).port;
...@@ -38,48 +34,19 @@ function ContentMetadataProvider(opt_messagePort) { ...@@ -38,48 +34,19 @@ function ContentMetadataProvider(opt_messagePort) {
/** /**
* Map from Entry.toURL() to callback. * Map from Entry.toURL() to callback.
* Note that simultaneous requests for same url are handled in MetadataCache. * Note that simultaneous requests for same url are handled in
* @private {!Object<!string, !Array<function(!MetadataItem)>>} * MetadataCache.
* @const * @private @const {!Object<!string, !Array<function(!MetadataItem)>>}
*/ */
this.callbacks_ = {}; this.callbacks_ = {};
} }
/**
* @const {!Array<string>}
*/
ContentMetadataProvider.PROPERTY_NAMES = [
'contentImageTransform',
'contentThumbnailTransform',
'contentThumbnailUrl',
'exifLittleEndian',
'ifd',
'imageHeight',
'imageWidth',
'mediaAlbum',
'mediaArtist',
'mediaDuration',
'mediaGenre',
'mediaMimeType',
'mediaTitle',
'mediaTrack',
'mediaYearRecorded',
];
/**
* Path of a worker script.
* @public {string}
*/
ContentMetadataProvider.WORKER_SCRIPT =
'chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj/' +
'foreground/js/metadata/metadata_dispatcher.js';
/** /**
* Converts content metadata from parsers to the internal format. * Converts content metadata from parsers to the internal format.
* @param {Object} metadata The content metadata. * @param {Object} metadata The content metadata.
* @return {!MetadataItem} Converted metadata. * @return {!MetadataItem} Converted metadata.
*/ */
ContentMetadataProvider.convertContentMetadata = metadata => { static convertContentMetadata(metadata) {
const item = new MetadataItem(); const item = new MetadataItem();
item.contentImageTransform = metadata['imageTransform']; item.contentImageTransform = metadata['imageTransform'];
item.contentThumbnailTransform = metadata['thumbnailTransform']; item.contentThumbnailTransform = metadata['thumbnailTransform'];
...@@ -90,14 +57,10 @@ ContentMetadataProvider.convertContentMetadata = metadata => { ...@@ -90,14 +57,10 @@ ContentMetadataProvider.convertContentMetadata = metadata => {
item.imageWidth = metadata['width']; item.imageWidth = metadata['width'];
item.mediaMimeType = metadata['mimeType']; item.mediaMimeType = metadata['mimeType'];
return item; return item;
}; }
ContentMetadataProvider.prototype.__proto__ = MetadataProvider.prototype;
/** /** @override */
* @override get(requests) {
*/
ContentMetadataProvider.prototype.get = function(requests) {
if (!requests.length) { if (!requests.length) {
return Promise.resolve([]); return Promise.resolve([]);
} }
...@@ -110,9 +73,9 @@ ContentMetadataProvider.prototype.get = function(requests) { ...@@ -110,9 +73,9 @@ ContentMetadataProvider.prototype.get = function(requests) {
}).bind(null, requests[i]))); }).bind(null, requests[i])));
} }
return Promise.all(promises); return Promise.all(promises);
}; }
/** /**
* Fetches the metadata. * Fetches the metadata.
* @param {!Entry} entry File entry. * @param {!Entry} entry File entry.
* @param {!Array<string>} names Requested metadata type. * @param {!Array<string>} names Requested metadata type.
...@@ -120,7 +83,7 @@ ContentMetadataProvider.prototype.get = function(requests) { ...@@ -120,7 +83,7 @@ ContentMetadataProvider.prototype.get = function(requests) {
* This callback is called asynchronously. * This callback is called asynchronously.
* @private * @private
*/ */
ContentMetadataProvider.prototype.getImpl_ = function(entry, names, callback) { getImpl_(entry, names, callback) {
if (entry.isDirectory) { if (entry.isDirectory) {
setTimeout( setTimeout(
callback.bind( callback.bind(
...@@ -147,19 +110,19 @@ ContentMetadataProvider.prototype.getImpl_ = function(entry, names, callback) { ...@@ -147,19 +110,19 @@ ContentMetadataProvider.prototype.getImpl_ = function(entry, names, callback) {
return; return;
} }
this.getFromMediaGalleries_(entry, names).then(callback); this.getFromMediaGalleries_(entry, names).then(callback);
}; }
/** /**
* Gets a metadata from mediaGalleries API * Gets a metadata from mediaGalleries API
* *
* @param {!Entry} entry File entry. * @param {!Entry} entry File entry.
* @param {!Array<string>} names Requested metadata type. * @param {!Array<string>} names Requested metadata type.
* @return {!Promise<!MetadataItem>} Promise that resolves with the metadata of * @return {!Promise<!MetadataItem>} Promise that resolves with the metadata
* of
* the entry. * the entry.
* @private * @private
*/ */
ContentMetadataProvider.prototype.getFromMediaGalleries_ = function( getFromMediaGalleries_(entry, names) {
entry, names) {
const self = this; const self = this;
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
entry.file( entry.file(
...@@ -192,14 +155,14 @@ ContentMetadataProvider.prototype.getFromMediaGalleries_ = function( ...@@ -192,14 +155,14 @@ ContentMetadataProvider.prototype.getFromMediaGalleries_ = function(
'failed to open file entry')); 'failed to open file entry'));
}); });
}); });
}; }
/** /**
* Dispatches a message from a metadata reader to the appropriate on* method. * Dispatches a message from a metadata reader to the appropriate on* method.
* @param {Object} event The event. * @param {Object} event The event.
* @private * @private
*/ */
ContentMetadataProvider.prototype.onMessage_ = function(event) { onMessage_(event) {
const data = event.data; const data = event.data;
switch (data.verb) { switch (data.verb) {
case 'initialized': case 'initialized':
...@@ -224,14 +187,14 @@ ContentMetadataProvider.prototype.onMessage_ = function(event) { ...@@ -224,14 +187,14 @@ ContentMetadataProvider.prototype.onMessage_ = function(event) {
assertNotReached(); assertNotReached();
break; break;
} }
}; }
/** /**
* Handles the 'initialized' message from the metadata reader Worker. * Handles the 'initialized' message from the metadata reader Worker.
* @param {RegExp} regexp Regexp of supported urls. * @param {RegExp} regexp Regexp of supported urls.
* @private * @private
*/ */
ContentMetadataProvider.prototype.onInitialized_ = function(regexp) { onInitialized_(regexp) {
this.urlFilter_ = regexp; this.urlFilter_ = regexp;
// Tests can monitor for this state with // Tests can monitor for this state with
...@@ -242,32 +205,33 @@ ContentMetadataProvider.prototype.onInitialized_ = function(regexp) { ...@@ -242,32 +205,33 @@ ContentMetadataProvider.prototype.onInitialized_ = function(regexp) {
// URL requests in-flight. // URL requests in-flight.
util.testSendMessage('worker-initialized'); util.testSendMessage('worker-initialized');
this.initialized_ = true; this.initialized_ = true;
}; }
/** /**
* Handles the 'result' message from the worker. * Handles the 'result' message from the worker.
* @param {string} url File url. * @param {string} url File url.
* @param {!MetadataItem} metadataItem The metadata item. * @param {!MetadataItem} metadataItem The metadata item.
* @private * @private
*/ */
ContentMetadataProvider.prototype.onResult_ = function(url, metadataItem) { onResult_(url, metadataItem) {
const callbacks = this.callbacks_[url]; const callbacks = this.callbacks_[url];
delete this.callbacks_[url]; delete this.callbacks_[url];
for (let i = 0; i < callbacks.length; i++) { for (let i = 0; i < callbacks.length; i++) {
callbacks[i](metadataItem); callbacks[i](metadataItem);
} }
}; }
/** /**
* Handles the 'log' message from the worker. * Handles the 'log' message from the worker.
* @param {Array<*>} arglist Log arguments. * @param {Array<*>} arglist Log arguments.
* @private * @private
*/ */
ContentMetadataProvider.prototype.onLog_ = arglist => { onLog_(arglist) {
console.log.apply(console, ['ContentMetadataProvider log:'].concat(arglist)); console.log.apply(
}; console, ['ContentMetadataProvider log:'].concat(arglist));
}
/** /**
* Dispatches a message from MediaGalleries API to the appropriate on* method. * Dispatches a message from MediaGalleries API to the appropriate on* method.
* @param {!Entry} entry File entry. * @param {!Entry} entry File entry.
* @param {!Object} metadata The metadata from MediaGalleries API. * @param {!Object} metadata The metadata from MediaGalleries API.
...@@ -275,8 +239,7 @@ ContentMetadataProvider.prototype.onLog_ = arglist => { ...@@ -275,8 +239,7 @@ ContentMetadataProvider.prototype.onLog_ = arglist => {
* converted metadata item. * converted metadata item.
* @private * @private
*/ */
ContentMetadataProvider.prototype.convertMediaMetadataToMetadataItem_ = convertMediaMetadataToMetadataItem_(entry, metadata) {
function(entry, metadata) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (!metadata) { if (!metadata) {
resolve(this.createError_( resolve(this.createError_(
...@@ -352,9 +315,9 @@ ContentMetadataProvider.prototype.convertMediaMetadataToMetadataItem_ = ...@@ -352,9 +315,9 @@ ContentMetadataProvider.prototype.convertMediaMetadataToMetadataItem_ =
resolve(item); resolve(item);
} }
}); });
}; }
/** /**
* Handles the 'error' message from the worker. * Handles the 'error' message from the worker.
* @param {string} url File entry. * @param {string} url File entry.
* @param {string} step Step failed. * @param {string} step Step failed.
...@@ -362,8 +325,7 @@ ContentMetadataProvider.prototype.convertMediaMetadataToMetadataItem_ = ...@@ -362,8 +325,7 @@ ContentMetadataProvider.prototype.convertMediaMetadataToMetadataItem_ =
* @return {!MetadataItem} Error metadata * @return {!MetadataItem} Error metadata
* @private * @private
*/ */
ContentMetadataProvider.prototype.createError_ = createError_(url, step, errorDescription) {
(url, step, errorDescription) => {
// For error case, fill all fields with error object. // For error case, fill all fields with error object.
const error = const error =
new ContentMetadataProvider.Error(url, step, errorDescription); new ContentMetadataProvider.Error(url, step, errorDescription);
...@@ -372,32 +334,55 @@ ContentMetadataProvider.prototype.createError_ = ...@@ -372,32 +334,55 @@ ContentMetadataProvider.prototype.createError_ =
item.contentThumbnailTransformError = error; item.contentThumbnailTransformError = error;
item.contentThumbnailUrlError = error; item.contentThumbnailUrlError = error;
return item; return item;
}; }
}
/** /**
* Content metadata provider error. * Content metadata provider error.
*/
ContentMetadataProvider.Error = class extends Error {
/**
* @param {string} url File Entry. * @param {string} url File Entry.
* @param {string} step Step failed. * @param {string} step Step failed.
* @param {string} errorDescription Error description. * @param {string} errorDescription Error description.
* @constructor
* @struct
* @extends {Error}
*/
ContentMetadataProvider.Error = function(url, step, errorDescription) {
/**
* @public {string}
*/ */
constructor(url, step, errorDescription) {
super(errorDescription);
/** @public @const {string} */
this.url = url; this.url = url;
/** /** @public @const {string} */
* @public {string}
*/
this.step = step; this.step = step;
/** /** @public @const {string} */
* @public {string}
*/
this.errorDescription = errorDescription; this.errorDescription = errorDescription;
}
}; };
ContentMetadataProvider.Error.prototype.__proto__ = Error.prototype; /** @public @const {!Array<string>} */
ContentMetadataProvider.PROPERTY_NAMES = [
'contentImageTransform',
'contentThumbnailTransform',
'contentThumbnailUrl',
'exifLittleEndian',
'ifd',
'imageHeight',
'imageWidth',
'mediaAlbum',
'mediaArtist',
'mediaDuration',
'mediaGenre',
'mediaMimeType',
'mediaTitle',
'mediaTrack',
'mediaYearRecorded',
];
/**
* Path of a worker script.
* @public @const {string}
*/
ContentMetadataProvider.WORKER_SCRIPT =
'chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj/' +
'foreground/js/metadata/metadata_dispatcher.js';
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