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

Unified Diff: ui/file_manager/file_manager/background/js/media_scanner.js

Issue 792233009: Reflect scanning status in command UI. Only allow import once scanning is complete. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix FM.jstests.cc && Finalize scan results in MediaImportHandlerTest...unbreaking the test. Created 6 years 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/background/js/media_scanner.js
diff --git a/ui/file_manager/file_manager/background/js/media_scanner.js b/ui/file_manager/file_manager/background/js/media_scanner.js
index 529a95e68bbccc220b47826253d124c6fba7066c..358f076aa3e84f2b1dae18c90dcfd7e9803a5b58 100644
--- a/ui/file_manager/file_manager/background/js/media_scanner.js
+++ b/ui/file_manager/file_manager/background/js/media_scanner.js
@@ -19,6 +19,20 @@ importer.MediaScanner = function() {};
importer.MediaScanner.prototype.scan;
/**
+ * Adds an observer, which will be notified on scan events.
+ *
+ * @param {!importer.ScanObserver} observer
+ */
+importer.MediaScanner.prototype.addObserver;
+
+/**
+ * Remove a previously registered observer.
+ *
+ * @param {!importer.ScanObserver} observer
+ */
+importer.MediaScanner.prototype.removeObserver;
+
+/**
* Class representing the results of a scan operation.
*
* @interface
@@ -26,8 +40,13 @@ importer.MediaScanner.prototype.scan;
importer.ScanResult = function() {};
/**
+ * @return {boolean} true if scanning is complete.
+ */
+importer.ScanResult.prototype.isFinal;
+
+/**
* Returns all files entries discovered so far. The list will be
- * complete only after scanning has completed and {@code isFinished}
+ * complete only after scanning has completed and {@code isFinal}
* returns {@code true}.
*
* @return {!Array.<!FileEntry>}
@@ -54,7 +73,7 @@ importer.ScanResult.prototype.getScanDurationMs;
*
* @return {!Promise.<!importer.ScanResult>}
*/
-importer.ScanResult.prototype.whenFinished;
+importer.ScanResult.prototype.whenFinal;
/**
* Recursively scans through a list of given files and directories, and creates
@@ -69,6 +88,24 @@ importer.ScanResult.prototype.whenFinished;
importer.DefaultMediaScanner = function(historyLoader) {
/** @private {!importer.HistoryLoader} */
this.historyLoader_ = historyLoader;
+
+ /** @private {!Array.<!importer.ScanObserver>} */
+ this.observers_ = [];
+};
+
+/** @override */
+importer.DefaultMediaScanner.prototype.addObserver = function(observer) {
+ this.observers_.push(observer);
+};
+
+/** @override */
+importer.DefaultMediaScanner.prototype.removeObserver = function(observer) {
+ var index = this.observers_.indexOf(observer);
+ if (index > -1) {
+ this.observers_.splice(index, 1);
+ } else {
+ console.warn('Ignoring request to remove observer that is not registered.');
+ }
};
/** @override */
@@ -84,10 +121,30 @@ importer.DefaultMediaScanner.prototype.scan = function(entries) {
.then(scanResult.resolveScan.bind(scanResult))
.catch(scanResult.rejectScan.bind(scanResult));
+ scanResult.whenFinal()
+ .then(
+ function() {
+ this.onScanFinished_(scanResult);
+ }.bind(this));
+
return scanResult;
};
/**
+ * Called when a scan is finished.
+ *
+ * @param {!importer.DefaultScanResult} result
+ * @private
+ */
+importer.DefaultMediaScanner.prototype.onScanFinished_ = function(result) {
+ this.observers_.forEach(
+ /** @param {!importer.ScanObserver} observer */
+ function(observer) {
+ observer(importer.ScanEvent.FINALIZED, result);
+ });
+};
+
+/**
* Resolves the entry to a list of {@code FileEntry}.
*
* @param {!importer.DefaultScanResult} result
@@ -137,7 +194,7 @@ importer.DefaultMediaScanner.prototype.scanDirectory_ =
* will change as the scan operation discovers files.
*
* <p>The scan is complete, and the object will become static once the
- * {@code whenFinished} promise resolves.
+ * {@code whenFinal} promise resolves.
*
* @constructor
* @struct
@@ -170,6 +227,9 @@ importer.DefaultScanResult = function(historyLoader) {
*/
this.lastScanActivity_ = this.scanStarted_;
+ /** @private {boolean} */
+ this.settled_ = false;
+
/** @type {function()} */
this.resolveScan;
@@ -180,13 +240,23 @@ importer.DefaultScanResult = function(historyLoader) {
this.finishedPromise_ = new Promise(
function(resolve, reject) {
this.resolveScan = function() {
+ this.settled_ = true;
resolve(this);
}.bind(this);
- this.rejectScan = reject;
+
+ this.rejectScan = function() {
+ this.settled_ = true;
+ reject();
+ };
}.bind(this));
};
/** @override */
+importer.DefaultScanResult.prototype.isFinal = function() {
+ return this.settled_;
+};
+
+/** @override */
importer.DefaultScanResult.prototype.getFileEntries = function() {
return this.fileEntries_;
};
@@ -202,7 +272,7 @@ importer.DefaultScanResult.prototype.getScanDurationMs = function() {
};
/** @override */
-importer.DefaultScanResult.prototype.whenFinished = function() {
+importer.DefaultScanResult.prototype.whenFinal = function() {
return this.finishedPromise_;
};

Powered by Google App Engine
This is Rietveld 408576698