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

Unified Diff: ui/file_manager/file_manager/foreground/js/directory_model.js

Issue 1022423005: Move view change analytics tracking into DirectoryModel where implementation details can be hidden. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Use slashes to separate view names from 'extra info' 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/foreground/js/directory_model.js
diff --git a/ui/file_manager/file_manager/foreground/js/directory_model.js b/ui/file_manager/file_manager/foreground/js/directory_model.js
index c7c8213865b2c1a2474393dbee011110cfb10940..2cf327d4a887dbbaeef9fe2f2aaf5dbab572eed1 100644
--- a/ui/file_manager/file_manager/foreground/js/directory_model.js
+++ b/ui/file_manager/file_manager/foreground/js/directory_model.js
@@ -11,6 +11,9 @@ var SHORT_RESCAN_INTERVAL = 100;
/**
* Data model of the file manager.
*
+ * @constructor
+ * @extends {cr.EventTarget}
+ *
* @param {boolean} singleSelection True if only one file could be selected
* at the time.
* @param {FileFilter} fileFilter Instance of FileFilter.
@@ -18,12 +21,15 @@ var SHORT_RESCAN_INTERVAL = 100;
* service.
* @param {VolumeManagerWrapper} volumeManager The volume manager.
* @param {!FileOperationManager} fileOperationManager File operation manager.
- * @constructor
- * @extends {cr.EventTarget}
+ * @param {!analytics.Tracker} tracker
*/
-function DirectoryModel(singleSelection, fileFilter,
- metadataModel,
- volumeManager, fileOperationManager) {
+function DirectoryModel(
+ singleSelection,
+ fileFilter,
+ metadataModel,
+ volumeManager,
+ fileOperationManager,
+ tracker) {
this.fileListSelection_ = singleSelection ?
new FileListSingleSelectionModel() : new FileListSelectionModel();
@@ -65,6 +71,9 @@ function DirectoryModel(singleSelection, fileFilter,
fileOperationManager,
'entries-changed',
this.onEntriesChanged_.bind(this));
+
+ /** @private {!analytics.Tracker} */
+ this.tracker_ = tracker;
}
/**
@@ -921,17 +930,23 @@ DirectoryModel.prototype.changeDirectoryEntry = function(
var previousDirEntry =
this.currentDirContents_.getDirectoryEntry();
- this.clearAndScan_(
- newDirectoryContents,
- function(result) {
- // Calls the callback of the method when successful.
- if (result && opt_callback)
- opt_callback();
-
- // Notify that the current task of this.directoryChangeQueue_
- // is completed.
- setTimeout(queueTaskCallback, 0);
- });
+
+ var promises = [];
+
+ promises.push(
+ new Promise(
+ /** @this {DirectoryModel} */
+ function(resolve) {
+ this.clearAndScan_(
+ newDirectoryContents,
+ function(result) {
+ // Calls the callback of the method when successful.
+ if (result && opt_callback)
+ opt_callback();
+
+ resolve(undefined);
+ });
+ }.bind(this)));
// For tests that open the dialog to empty directories, everything
// is loaded at this point.
@@ -945,12 +960,58 @@ DirectoryModel.prototype.changeDirectoryEntry = function(
event.previousDirEntry = previousDirEntry;
event.newDirEntry = dirEntry;
event.volumeChanged = previousVolumeInfo !== currentVolumeInfo;
+
+ if (event.volumeChanged) {
+ promises.push(this.onVolumeChanged_(currentVolumeInfo));
+ }
+
this.dispatchEvent(event);
+ Promise.all(promises).then(queueTaskCallback);
}.bind(this));
}.bind(this, this.changeDirectorySequence_));
};
/**
+ * Handles volume changed by sending an analytics appView event.
+ *
+ * @param {!VolumeInfo} volumeInfo The new volume info.
+ * @return {!Promise} resolves once handling is done.
+ * @private
+ */
+DirectoryModel.prototype.onVolumeChanged_ = function(volumeInfo) {
+ // NOTE: That dynamic values, like volume name MUST NOT
+ // be sent to GA as that value can contain PII.
+ // VolumeType is an enum.
+ // ...
+ // But we can do stuff like
mtomasz 2015/03/24 01:34:58 nit: I'm OK not to fill to 80 characters, but this
Steve McKay 2015/03/24 22:39:20 Done.
+ // figure out if this is a media device or vanilla
+ // removable device.
+ return Promise.resolve(undefined)
+ .then(
+ function() {
+ switch (volumeInfo.volumeType) {
+ case VolumeManagerCommon.VolumeType.REMOVABLE:
+ return importer.hasMediaDirectory(volumeInfo.fileSystem.root)
mtomasz 2015/03/24 01:34:58 I'm worried about performance here. Switching volu
Steve McKay 2015/03/24 22:39:20 That's a valid concern. Fixed the hasMediaDirector
+ .then(
+ /** @param {boolean} hasMedia */
mtomasz 2015/03/24 01:34:58 nit: Do we need @return here?
Steve McKay 2015/03/24 22:39:20 Done.
+ function(hasMedia) {
+ return hasMedia ?
+ volumeInfo.volumeType + '/with-media-dir' :
+ volumeInfo.volumeType;
+ });
+ case VolumeManagerCommon.VolumeType.PROVIDED:
+ // TODO(smckay): Can we supply a human readable name?
Steve McKay 2015/03/24 22:39:20 Tomasz, this is a question for you.
Steve McKay 2015/03/24 23:49:22 Actually. I saw your response. Ignore this.
+ // And should we limit this list to just known providers
+ // like the zip extension.
+ return volumeInfo.volumeType + '/' + volumeInfo.extensionId;
+ default:
+ return volumeInfo.volumeType;
+ }
+ })
+ .then(this.tracker_.sendAppView.bind(this.tracker_));
+};
+
+/**
* Activates the given directory.
* This method:
* - Changes the current directory, if the given directory is the current

Powered by Google App Engine
This is Rietveld 408576698