Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(184)

Unified Diff: ui/file_manager/file_manager/common/js/importer_common.js

Issue 1013893002: Update ImportHistory with support for reading history from multiple files. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Respond to review comments. Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/file_manager/file_manager/common/js/importer_common.js
diff --git a/ui/file_manager/file_manager/common/js/importer_common.js b/ui/file_manager/file_manager/common/js/importer_common.js
index 10f65e12da0089897eed81902a75dd3a3c1e22a5..e9f390591537c67ee5bbb620793bd3398f6ffa11 100644
--- a/ui/file_manager/file_manager/common/js/importer_common.js
+++ b/ui/file_manager/file_manager/common/js/importer_common.js
@@ -43,7 +43,7 @@ importer.ScanObserver;
/**
* Volume types eligible for the affections of Cloud Import.
- * @private @const {!Array.<!VolumeManagerCommon.VolumeType>}
+ * @private @const {!Array<!VolumeManagerCommon.VolumeType>}
*/
importer.ELIGIBLE_VOLUME_TYPES_ = [
VolumeManagerCommon.VolumeType.MTP,
@@ -144,7 +144,7 @@ importer.isMediaDirectory = function(entry, volumeInfoProvider) {
};
/**
- * @return {!Promise.<boolean>} Resolves with true when Cloud Import feature
+ * @return {!Promise<boolean>} Resolves with true when Cloud Import feature
* is enabled.
*/
importer.importEnabled = function() {
@@ -182,7 +182,7 @@ importer.handlePhotosAppMessage = function(message) {
};
/**
- * @return {!Promise.<boolean>} Resolves with true when Cloud Import feature
+ * @return {!Promise<boolean>} Resolves with true when Cloud Import feature
* is enabled.
*/
importer.isPhotosAppImportEnabled = function() {
@@ -211,7 +211,7 @@ importer.getDirectoryNameForDate = function(date) {
};
/**
- * @return {!Promise.<number>} Resolves with an integer that is probably
+ * @return {!Promise<number>} Resolves with an integer that is probably
* relatively unique to this machine (among a users machines).
*/
importer.getMachineId = function() {
@@ -232,7 +232,7 @@ importer.getMachineId = function() {
};
/**
- * @return {!Promise.<string>} Resolves with the filename of this
+ * @return {!Promise<string>} Resolves with the filename of this
* machines history file.
*/
importer.getHistoryFilename = function() {
@@ -244,7 +244,7 @@ importer.getHistoryFilename = function() {
/**
* @param {number} logId
- * @return {!Promise.<string>} Resolves with the filename of this
+ * @return {!Promise<string>} Resolves with the filename of this
* machines debug log file.
*/
importer.getDebugLogFilename = function(logId) {
@@ -280,7 +280,7 @@ importer.Resolver = function() {
/** @private {function(*=)} */
this.reject_;
- /** @private {!Promise.<T>} */
+ /** @private {!Promise<T>} */
this.promise_ = new Promise(
function(resolve, reject) {
this.resolve_ = resolve;
@@ -310,7 +310,7 @@ importer.Resolver.prototype = /** @struct */ {
return this.reject_;
},
/**
- * @return {!Promise.<T>}
+ * @return {!Promise<T>}
* @template T
*/
get promise() {
@@ -358,8 +358,19 @@ importer.PromisingFileEntry = function(fileEntry) {
};
/**
+ * Convenience method for creating new instances. Can, for example,
+ * be passed to Array.map.
+ *
+ * @param {!FileEntry} entry
+ * @return {!importer.PromisingFileEntry}
+ */
+importer.PromisingFileEntry.create = function(entry) {
+ return new importer.PromisingFileEntry(entry);
+};
+
+/**
* A "Promisary" wrapper around entry.getWriter.
- * @return {!Promise.<!FileWriter>}
+ * @return {!Promise<!FileWriter>}
*/
importer.PromisingFileEntry.prototype.createWriter = function() {
return new Promise(this.fileEntry_.createWriter.bind(this.fileEntry_));
@@ -367,14 +378,14 @@ importer.PromisingFileEntry.prototype.createWriter = function() {
/**
* A "Promisary" wrapper around entry.file.
- * @return {!Promise.<!File>}
+ * @return {!Promise<!File>}
*/
importer.PromisingFileEntry.prototype.file = function() {
return new Promise(this.fileEntry_.file.bind(this.fileEntry_));
};
/**
- * @return {!Promise.<!Object>}
+ * @return {!Promise<!Object>}
*/
importer.PromisingFileEntry.prototype.getMetadata = function() {
return new Promise(this.fileEntry_.getMetadata.bind(this.fileEntry_));
@@ -420,7 +431,7 @@ importer.inflateAppUrl = function(deflated) {
/**
* @param {!FileEntry} fileEntry
- * @return {!Promise.<string>} Resolves with a "hashcode" consisting of
+ * @return {!Promise<string>} Resolves with a "hashcode" consisting of
* just the last modified time and the file size.
*/
importer.createMetadataHashcode = function(fileEntry) {
@@ -436,7 +447,7 @@ importer.createMetadataHashcode = function(fileEntry) {
.then(
/**
* @param {!Object} metadata
- * @return {!Promise.<string>}
+ * @return {!Promise<string>}
* @this {importer.PersistentImportHistory}
*/
function(metadata) {
@@ -469,95 +480,21 @@ importer.toSecondsFromEpoch = function(date) {
};
/**
- * Factory interface for creating/accessing synced {@code FileEntry}
- * instances and listening to sync events on those files.
- *
- * @interface
- */
-importer.SyncFileEntryProvider = function() {};
-
-/**
- * Provides accsess to the sync FileEntry owned/managed by this class.
- *
- * @return {!Promise.<!FileEntry>}
+ * Namespace for ChromeSyncFilesystem related stuffs.
*/
-importer.SyncFileEntryProvider.prototype.getSyncFileEntry;
-
-/**
- * Factory for synchronized files based on chrome.syncFileSystem.
- *
- * @constructor
- * @implements {importer.SyncFileEntryProvider}
- * @struct
- *
- * @param {string} fileName
- */
-importer.ChromeSyncFileEntryProvider = function(fileName) {
-
- /** @private {string} */
- this.fileName_ = fileName;
-
- /** @private {!Array.<function()>} */
- this.syncListeners_ = [];
-
- /** @private {Promise.<!FileEntry>} */
- this.fileEntryPromise_ = null;
-};
-
-/**
- * Returns a sync FileEntry. Convenience method for class that just want
- * a file, but don't need to monitor changes.
- * @param {!Promise.<string>} fileNamePromise
- * @return {!Promise.<!FileEntry>}
- */
-importer.ChromeSyncFileEntryProvider.getFileEntry =
- function(fileNamePromise) {
- return fileNamePromise.then(
- function(fileName) {
- return new importer.ChromeSyncFileEntryProvider(fileName)
- .getSyncFileEntry();
- });
-};
-
-/** @override */
-importer.ChromeSyncFileEntryProvider.prototype.getSyncFileEntry = function() {
- if (this.fileEntryPromise_) {
- return /** @type {!Promise.<!FileEntry>} */ (this.fileEntryPromise_);
- };
-
- this.fileEntryPromise_ = this.getFileSystem_()
- .then(
- /**
- * @param {!FileSystem} fileSystem
- * @return {!Promise.<!FileEntry>}
- * @this {importer.ChromeSyncFileEntryProvider}
- */
- function(fileSystem) {
- return this.getFileEntry_(fileSystem);
- }.bind(this));
-
- return /** @type {!Promise.<!FileEntry>} */ (this.fileEntryPromise_);
-};
+importer.ChromeSyncFilesystem = {};
/**
* Wraps chrome.syncFileSystem in a Promise.
*
- * @return {!Promise.<!FileSystem>}
+ * @return {!Promise<!FileSystem>}
* @private
*/
-importer.ChromeSyncFileEntryProvider.prototype.getFileSystem_ = function() {
+importer.ChromeSyncFilesystem.getFileSystem_ = function() {
return new Promise(
- /**
- * @param {function()} resolve
- * @param {function()} reject
- * @this {importer.ChromeSyncFileEntryProvider}
- */
function(resolve, reject) {
chrome.syncFileSystem.requestFileSystem(
- /**
- * @param {FileSystem} fileSystem
- * @this {importer.ChromeSyncFileEntryProvider}
- */
+ /** @param {FileSystem} fileSystem */
function(fileSystem) {
if (chrome.runtime.lastError) {
reject(chrome.runtime.lastError.message);
@@ -565,86 +502,42 @@ importer.ChromeSyncFileEntryProvider.prototype.getFileSystem_ = function() {
resolve(/** @type {!FileSystem} */ (fileSystem));
}
});
- }.bind(this));
-};
-
-/**
- * @param {!FileSystem} fileSystem
- * @return {!Promise.<!FileEntry>}
- * @private
- */
-importer.ChromeSyncFileEntryProvider.prototype.getFileEntry_ =
- function(fileSystem) {
- return new Promise(
- /**
- * @param {function()} resolve
- * @param {function()} reject
- * @this {importer.ChromeSyncFileEntryProvider}
- */
- function(resolve, reject) {
- fileSystem.root.getFile(
- this.fileName_,
- {
- create: true,
- exclusive: false
- },
- resolve,
- reject);
- }.bind(this));
+ });
};
/**
- * Handles sync events. Checks to see if the event is for the file
- * we track, and sync-direction, and if so, notifies syncListeners.
- *
- * @see https://developer.chrome.com/apps/syncFileSystem
- * #event-onFileStatusChanged
+ * Returns a sync file entry for the named file, creating it as needed.
*
- * @param {!Object} event Having a structure not unlike: {
- * fileEntry: Entry,
- * status: string,
- * action: (string|undefined),
- * direction: (string|undefined)}
- *
- * @private
+ * @param {!Promise<string>} fileNamePromise
+ * @return {!Promise<!FileEntry>}
*/
-importer.ChromeSyncFileEntryProvider.prototype.handleSyncEvent_ =
- function(event) {
- if (!this.fileEntryPromise_) {
- return;
- }
+importer.ChromeSyncFilesystem.getOrCreateFileEntry = function(fileNamePromise) {
+ var promise = importer.ChromeSyncFilesystem.getFileSystem_()
+ .then(
+ /**
+ * @param {!FileSystem} fileSystem
+ * @return {!Promise<!FileEntry>}
+ */
+ function(fileSystem) {
+ fileNamePromise.then(
+ /** @param {string} fileName */
+ function(fileName) {
+ return new Promise(
+ function(resolve, reject) {
+ fileSystem.root.getFile(
+ fileName,
+ {
+ create: true,
+ exclusive: false
+ },
+ resolve,
+ reject);
+ });
- this.fileEntryPromise_.then(
- /**
- * @param {!FileEntry} fileEntry
- * @this {importer.ChromeSyncFileEntryProvider}
- */
- function(fileEntry) {
- if (event['fileEntry'].fullPath !== fileEntry.fullPath) {
- return;
- }
-
- if (event.direction && event.direction !== 'remote_to_local') {
- return;
- }
-
- if (event.action && event.action !== 'updated') {
- console.warn(
- 'Unusual sync event action for sync file: ' + event.action);
- return;
- }
-
- this.syncListeners_.forEach(
- /**
- * @param {function()} listener
- * @this {importer.ChromeSyncFileEntryProvider}
- */
- function(listener) {
- // Notify by way of a promise so that it is fully asynchronous
- // (which can rationalize testing).
- Promise.resolve().then(listener);
- }.bind(this));
- }.bind(this));
+ });
+ });
+
+ return /** @type {!Promise<!FileEntry>} */ (promise);
};
/**
@@ -684,19 +577,19 @@ importer.Logger.prototype.catcher;
* @struct
* @final
*
- * @param {!Promise.<!FileEntry>} fileEntryPromise
- * @param {!Promise.<!analytics.Tracker>} trackerPromise
+ * @param {!Promise<!FileEntry>} fileEntryPromise
+ * @param {!Promise<!analytics.Tracker>} trackerPromise
*/
importer.RuntimeLogger = function(fileEntryPromise, trackerPromise) {
- /** @private {!Promise.<!importer.PromisingFileEntry>} */
+ /** @private {!Promise<!importer.PromisingFileEntry>} */
this.fileEntryPromise_ = fileEntryPromise.then(
/** @param {!FileEntry} fileEntry */
function(fileEntry) {
return new importer.PromisingFileEntry(fileEntry);
});
- /** @private {!Promise.<!analytics.Tracker>} */
+ /** @private {!Promise<!analytics.Tracker>} */
this.trackerPromise_ = trackerPromise;
};
@@ -805,13 +698,14 @@ importer.logger_ = null;
*/
importer.getLogger = function() {
if (!importer.logger_) {
+
var nextLogId = importer.getNextDebugLogId_();
/** @return {!Promise} */
var rotator = function() {
return importer.rotateLogs(
nextLogId,
- importer.ChromeSyncFileEntryProvider.getFileEntry);
+ importer.ChromeSyncFilesystem.getOrCreateFileEntry);
};
// This is a sligtly odd arrangement in service of two goals.
@@ -824,8 +718,8 @@ importer.getLogger = function() {
// produces the name of the file to load. That method
// (getDebugLogFilename) returns promise. We exploit this.
importer.logger_ = new importer.RuntimeLogger(
- importer.ChromeSyncFileEntryProvider.getFileEntry(
- /** @type {!Promise.<string>} */ (rotator().then(
+ importer.ChromeSyncFilesystem.getOrCreateFileEntry(
+ /** @type {!Promise<string>} */ (rotator().then(
importer.getDebugLogFilename.bind(null, nextLogId)))),
importer.getTracker_());
}
@@ -835,7 +729,7 @@ importer.getLogger = function() {
/**
* Fetch analytics.Tracker from background page.
- * @return {!Promise.<!analytics.Tracker>}
+ * @return {!Promise<!analytics.Tracker>}
* @private
*/
importer.getTracker_ = function() {
@@ -946,7 +840,7 @@ importer.ChromeLocalStorage.prototype.set = function(key, value) {
/**
* @param {string} key
* @param {T=} opt_default
- * @return {!Promise.<T>} Resolves with the value, or {@code opt_default} when
+ * @return {!Promise<T>} Resolves with the value, or {@code opt_default} when
* no value entry existis, or {@code undefined}.
* @template T
*/

Powered by Google App Engine
This is Rietveld 408576698