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 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
/** @final */
class ContentMetadataProvider extends MetadataProvider {
/**
* @param {!MessagePort=} opt_messagePort Message port overriding the default
* worker port.
* @extends {MetadataProvider}
* @constructor
* @struct
*/
function ContentMetadataProvider(opt_messagePort) {
MetadataProvider.call(this, ContentMetadataProvider.PROPERTY_NAMES);
constructor(opt_messagePort) {
super(ContentMetadataProvider.PROPERTY_NAMES);
/**
* Pass all URLs to the metadata reader until we have a correct filter.
......@@ -18,10 +17,7 @@ function ContentMetadataProvider(opt_messagePort) {
*/
this.urlFilter_ = /.*/;
/**
* @private {!MessagePort}
* @const
*/
/** @private @const {!MessagePort} */
this.dispatcher_ = opt_messagePort ?
opt_messagePort :
new SharedWorker(ContentMetadataProvider.WORKER_SCRIPT).port;
......@@ -38,48 +34,19 @@ function ContentMetadataProvider(opt_messagePort) {
/**
* Map from Entry.toURL() to callback.
* Note that simultaneous requests for same url are handled in MetadataCache.
* @private {!Object<!string, !Array<function(!MetadataItem)>>}
* @const
* Note that simultaneous requests for same url are handled in
* MetadataCache.
* @private @const {!Object<!string, !Array<function(!MetadataItem)>>}
*/
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.
* @param {Object} metadata The content metadata.
* @return {!MetadataItem} Converted metadata.
*/
ContentMetadataProvider.convertContentMetadata = metadata => {
static convertContentMetadata(metadata) {
const item = new MetadataItem();
item.contentImageTransform = metadata['imageTransform'];
item.contentThumbnailTransform = metadata['thumbnailTransform'];
......@@ -90,14 +57,10 @@ ContentMetadataProvider.convertContentMetadata = metadata => {
item.imageWidth = metadata['width'];
item.mediaMimeType = metadata['mimeType'];
return item;
};
ContentMetadataProvider.prototype.__proto__ = MetadataProvider.prototype;
}
/**
* @override
*/
ContentMetadataProvider.prototype.get = function(requests) {
/** @override */
get(requests) {
if (!requests.length) {
return Promise.resolve([]);
}
......@@ -110,9 +73,9 @@ ContentMetadataProvider.prototype.get = function(requests) {
}).bind(null, requests[i])));
}
return Promise.all(promises);
};
}
/**
/**
* Fetches the metadata.
* @param {!Entry} entry File entry.
* @param {!Array<string>} names Requested metadata type.
......@@ -120,7 +83,7 @@ ContentMetadataProvider.prototype.get = function(requests) {
* This callback is called asynchronously.
* @private
*/
ContentMetadataProvider.prototype.getImpl_ = function(entry, names, callback) {
getImpl_(entry, names, callback) {
if (entry.isDirectory) {
setTimeout(
callback.bind(
......@@ -147,19 +110,19 @@ ContentMetadataProvider.prototype.getImpl_ = function(entry, names, callback) {
return;
}
this.getFromMediaGalleries_(entry, names).then(callback);
};
}
/**
/**
* Gets a metadata from mediaGalleries API
*
* @param {!Entry} entry File entry.
* @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.
* @private
*/
ContentMetadataProvider.prototype.getFromMediaGalleries_ = function(
entry, names) {
getFromMediaGalleries_(entry, names) {
const self = this;
return new Promise((resolve, reject) => {
entry.file(
......@@ -192,14 +155,14 @@ ContentMetadataProvider.prototype.getFromMediaGalleries_ = function(
'failed to open file entry'));
});
});
};
}
/**
/**
* Dispatches a message from a metadata reader to the appropriate on* method.
* @param {Object} event The event.
* @private
*/
ContentMetadataProvider.prototype.onMessage_ = function(event) {
onMessage_(event) {
const data = event.data;
switch (data.verb) {
case 'initialized':
......@@ -224,14 +187,14 @@ ContentMetadataProvider.prototype.onMessage_ = function(event) {
assertNotReached();
break;
}
};
}
/**
/**
* Handles the 'initialized' message from the metadata reader Worker.
* @param {RegExp} regexp Regexp of supported urls.
* @private
*/
ContentMetadataProvider.prototype.onInitialized_ = function(regexp) {
onInitialized_(regexp) {
this.urlFilter_ = regexp;
// Tests can monitor for this state with
......@@ -242,32 +205,33 @@ ContentMetadataProvider.prototype.onInitialized_ = function(regexp) {
// URL requests in-flight.
util.testSendMessage('worker-initialized');
this.initialized_ = true;
};
}
/**
/**
* Handles the 'result' message from the worker.
* @param {string} url File url.
* @param {!MetadataItem} metadataItem The metadata item.
* @private
*/
ContentMetadataProvider.prototype.onResult_ = function(url, metadataItem) {
onResult_(url, metadataItem) {
const callbacks = this.callbacks_[url];
delete this.callbacks_[url];
for (let i = 0; i < callbacks.length; i++) {
callbacks[i](metadataItem);
}
};
}
/**
/**
* Handles the 'log' message from the worker.
* @param {Array<*>} arglist Log arguments.
* @private
*/
ContentMetadataProvider.prototype.onLog_ = arglist => {
console.log.apply(console, ['ContentMetadataProvider log:'].concat(arglist));
};
onLog_(arglist) {
console.log.apply(
console, ['ContentMetadataProvider log:'].concat(arglist));
}
/**
/**
* Dispatches a message from MediaGalleries API to the appropriate on* method.
* @param {!Entry} entry File entry.
* @param {!Object} metadata The metadata from MediaGalleries API.
......@@ -275,8 +239,7 @@ ContentMetadataProvider.prototype.onLog_ = arglist => {
* converted metadata item.
* @private
*/
ContentMetadataProvider.prototype.convertMediaMetadataToMetadataItem_ =
function(entry, metadata) {
convertMediaMetadataToMetadataItem_(entry, metadata) {
return new Promise((resolve, reject) => {
if (!metadata) {
resolve(this.createError_(
......@@ -352,9 +315,9 @@ ContentMetadataProvider.prototype.convertMediaMetadataToMetadataItem_ =
resolve(item);
}
});
};
}
/**
/**
* Handles the 'error' message from the worker.
* @param {string} url File entry.
* @param {string} step Step failed.
......@@ -362,8 +325,7 @@ ContentMetadataProvider.prototype.convertMediaMetadataToMetadataItem_ =
* @return {!MetadataItem} Error metadata
* @private
*/
ContentMetadataProvider.prototype.createError_ =
(url, step, errorDescription) => {
createError_(url, step, errorDescription) {
// For error case, fill all fields with error object.
const error =
new ContentMetadataProvider.Error(url, step, errorDescription);
......@@ -372,32 +334,55 @@ ContentMetadataProvider.prototype.createError_ =
item.contentThumbnailTransformError = error;
item.contentThumbnailUrlError = error;
return item;
};
}
}
/**
* Content metadata provider error.
*/
ContentMetadataProvider.Error = class extends Error {
/**
* @param {string} url File Entry.
* @param {string} step Step failed.
* @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;
/**
* @public {string}
*/
/** @public @const {string} */
this.step = step;
/**
* @public {string}
*/
/** @public @const {string} */
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