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 c38bdbad8aa476b820ba927bc8836cd43dd8cc48..0bc881ede896d0a17c0f49075390659a5ce6eb5b 100644 |
--- a/ui/file_manager/file_manager/common/js/importer_common.js |
+++ b/ui/file_manager/file_manager/common/js/importer_common.js |
@@ -224,7 +224,7 @@ importer.getMachineId = function() { |
importer.getHistoryFilename = function() { |
return importer.getMachineId().then( |
function(machineId) { |
- return 'import-history-' + machineId + '.log'; |
+ return machineId + '-import-history.log'; |
}); |
}; |
@@ -236,7 +236,7 @@ importer.getHistoryFilename = function() { |
importer.getDebugLogFilename = function(logId) { |
return importer.getMachineId().then( |
function(machineId) { |
- return 'import-debug-' + machineId + '-' + logId + '.log'; |
+ return machineId + '-import-debug-' + logId + '.log'; |
}); |
}; |
@@ -645,8 +645,9 @@ importer.Logger.prototype.catcher; |
* @final |
* |
* @param {!Promise.<!FileEntry>} fileEntryPromise |
+ * @param {!Promise.<!analytics.Tracker>} trackerPromise |
*/ |
-importer.RuntimeLogger = function(fileEntryPromise) { |
+importer.RuntimeLogger = function(fileEntryPromise, trackerPromise) { |
/** @private {!Promise.<!importer.PromisingFileEntry>} */ |
this.fileEntryPromise_ = fileEntryPromise.then( |
@@ -654,6 +655,25 @@ importer.RuntimeLogger = function(fileEntryPromise) { |
function(fileEntry) { |
return new importer.PromisingFileEntry(fileEntry); |
}); |
+ |
+ /** @private {!Promise.<!analytics.Tracker>} */ |
+ this.trackerPromise_ = trackerPromise; |
+}; |
+ |
+/** |
+ * Reports an error to analytics. |
+ * |
+ * @param {string} context MUST NOT contain any dynamic error content, |
+ * only statically defined string will dooooo. |
+ */ |
+importer.RuntimeLogger.prototype.reportErrorContext_ = function(context) { |
+ this.trackerPromise_.then( |
+ /** @param {!analytics.Tracker} tracker */ |
+ function(tracker) { |
+ tracker.sendException( |
+ context, |
+ false /* fatal */ ); |
+ }); |
}; |
/** @override */ |
@@ -670,13 +690,18 @@ importer.RuntimeLogger.prototype.error = function(content) { |
/** @override */ |
importer.RuntimeLogger.prototype.catcher = function(context) { |
+ var prefix = '(' + context + ') '; |
return function(error) { |
- var prefix = '(' + context + ')'; |
- var message = prefix + ' Caught error in promise chain.'; |
+ this.reportErrorContext_(context); |
+ var message = prefix + 'Caught error in promise chain.'; |
if (error) { |
- this.error(message + ' Error' + error.message); |
- this.write_('STACK', prefix + ' Trace: ' + error.stack); |
+ // Error can be anything...maybe an Error, maybe a string. |
+ var error = error.message || error; |
+ this.error(message + ' Error: ' + error); |
+ if (error.stack) { |
+ this.write_('STACK', prefix + error.stack); |
+ } |
} else { |
this.error(message); |
error = new Error(message); |
@@ -760,18 +785,42 @@ importer.getLogger = function() { |
// (getDebugLogFilename) returns promise. We exploit this. |
importer.logger_ = new importer.RuntimeLogger( |
importer.ChromeSyncFileEntryProvider.getFileEntry( |
- /** @type {!Promise<string>} */ (rotator().then( |
- importer.getDebugLogFilename.bind(null, nextLogId))))); |
+ /** @type {!Promise.<string>} */ (rotator().then( |
+ importer.getDebugLogFilename.bind(null, nextLogId)))), |
+ importer.getTracker_()); |
} |
return importer.logger_; |
}; |
/** |
+ * Fetch analytics.Tracker from background page. |
+ * @return {!Promise.<!analytics.Tracker>} |
+ * @private |
+ */ |
+importer.getTracker_ = function() { |
+ return new Promise( |
+ function(resolve, reject) { |
+ chrome.runtime.getBackgroundPage( |
+ /** @param {Window=} opt_background */ |
+ function(opt_background) { |
+ if (chrome.runtime.lastError) { |
+ reject(chrome.runtime.lastError); |
+ } |
+ opt_background.background.ready( |
+ function() { |
+ resolve(opt_background.background.tracker); |
+ }); |
+ }); |
+ }); |
+}; |
+ |
+/** |
* Returns the log ID for the next debug log to use. |
* @private |
*/ |
importer.getNextDebugLogId_ = function() { |
+ // Changes every other month. |
return new Date().getMonth() % 2; |
}; |