From e0b6620f38f2f8ea20fbecf53fca033269e77f01 Mon Sep 17 00:00:00 2001 From: Sorab Bisht Date: Mon, 7 May 2018 01:37:33 -0700 Subject: [PATCH] Adding Analytics logging for JSRefactor, Live Preview, Quick Edit and more features (#14253) * Adding Analytics logging for JSRefactor, Live Preview, Quick Edit and more features * Addressing review comments --- src/LiveDevelopment/LiveDevelopment.js | 10 ++- src/editor/CSSInlineEditor.js | 9 +++ src/editor/EditorStatusBar.js | 10 ++- .../default/JavaScriptQuickEdit/main.js | 10 ++- .../default/JavaScriptRefactoring/main.js | 76 +++++++++++++++++-- .../default/MDNDocs/InlineDocsViewer.js | 20 ++++- src/extensions/default/MDNDocs/main.js | 11 ++- src/preferences/PreferencesDialogs.js | 10 ++- 8 files changed, 142 insertions(+), 14 deletions(-) diff --git a/src/LiveDevelopment/LiveDevelopment.js b/src/LiveDevelopment/LiveDevelopment.js index 93cd81f16f9..22e677ae372 100644 --- a/src/LiveDevelopment/LiveDevelopment.js +++ b/src/LiveDevelopment/LiveDevelopment.js @@ -96,7 +96,8 @@ define(function LiveDevelopment(require, exports, module) { StringUtils = require("utils/StringUtils"), UserServer = require("LiveDevelopment/Servers/UserServer").UserServer, WebSocketTransport = require("LiveDevelopment/transports/WebSocketTransport"), - PreferencesManager = require("preferences/PreferencesManager"); + PreferencesManager = require("preferences/PreferencesManager"), + HealthLogger = require("utils/HealthLogger"); // Inspector var Inspector = require("LiveDevelopment/Inspector/Inspector"); @@ -1350,6 +1351,13 @@ define(function LiveDevelopment(require, exports, module) { }); } } + // Send analytics data when Live Preview is opened + HealthLogger.sendAnalyticsData( + "livePreviewOpen", + "usage", + "livePreview", + "open" + ); // Register user defined server provider and keep handlers for further clean-up _regServers.push(LiveDevServerManager.registerServer({ create: _createUserServer }, 99)); diff --git a/src/editor/CSSInlineEditor.js b/src/editor/CSSInlineEditor.js index 363f722ed9c..e51a280f4d9 100644 --- a/src/editor/CSSInlineEditor.js +++ b/src/editor/CSSInlineEditor.js @@ -39,6 +39,7 @@ define(function (require, exports, module) { MultiRangeInlineEditor = require("editor/MultiRangeInlineEditor"), Strings = require("strings"), ViewUtils = require("utils/ViewUtils"), + HealthLogger = require("utils/HealthLogger"), _ = require("thirdparty/lodash"); var _newRuleCmd, @@ -169,6 +170,14 @@ define(function (require, exports, module) { return null; } + //Send analytics data for QuickEdit open + HealthLogger.sendAnalyticsData( + "QuickEditOpen", + "usage", + "quickEdit", + "open" + ); + // Only provide CSS editor if the selection is within a single line var sel = hostEditor.getSelection(); if (sel.start.line !== sel.end.line) { diff --git a/src/editor/EditorStatusBar.js b/src/editor/EditorStatusBar.js index d7ebbcead66..c3a53857fae 100644 --- a/src/editor/EditorStatusBar.js +++ b/src/editor/EditorStatusBar.js @@ -50,7 +50,8 @@ define(function (require, exports, module) { CommandManager = require("command/CommandManager"), Commands = require("command/Commands"), DocumentManager = require("document/DocumentManager"), - StringUtils = require("utils/StringUtils"); + StringUtils = require("utils/StringUtils"), + HealthLogger = require("utils/HealthLogger"); var SupportedEncodingsText = require("text!supported-encodings.json"), SupportedEncodings = JSON.parse(SupportedEncodingsText); @@ -174,6 +175,13 @@ define(function (require, exports, module) { selStr = ""; if (sels.length > 1) { + //Send analytics data for multicursor use + HealthLogger.sendAnalyticsData( + "multiCursor", + "usage", + "multiCursor", + "use" + ); selStr = StringUtils.format(Strings.STATUSBAR_SELECTION_MULTIPLE, sels.length); } else if (editor.hasSelection()) { var sel = sels[0]; diff --git a/src/extensions/default/JavaScriptQuickEdit/main.js b/src/extensions/default/JavaScriptQuickEdit/main.js index 72d95ad8aea..2f1089dba48 100644 --- a/src/extensions/default/JavaScriptQuickEdit/main.js +++ b/src/extensions/default/JavaScriptQuickEdit/main.js @@ -31,7 +31,8 @@ define(function (require, exports, module) { LanguageManager = brackets.getModule("language/LanguageManager"), PerfUtils = brackets.getModule("utils/PerfUtils"), ProjectManager = brackets.getModule("project/ProjectManager"), - Strings = brackets.getModule("strings"); + Strings = brackets.getModule("strings"), + HealthLogger = brackets.getModule("utils/HealthLogger"); /** * Return the token string that is at the specified position. @@ -196,6 +197,13 @@ define(function (require, exports, module) { return null; } + //Send analytics data for Quick Edit open + HealthLogger.sendAnalyticsData( + "QuickEditOpen", + "usage", + "quickEdit", + "open" + ); // Only provide JavaScript editor if the selection is within a single line var sel = hostEditor.getSelection(); if (sel.start.line !== sel.end.line) { diff --git a/src/extensions/default/JavaScriptRefactoring/main.js b/src/extensions/default/JavaScriptRefactoring/main.js index 4bc59753072..429256fa2a4 100644 --- a/src/extensions/default/JavaScriptRefactoring/main.js +++ b/src/extensions/default/JavaScriptRefactoring/main.js @@ -33,7 +33,10 @@ define(function (require, exports, module) { ExtractToFunction = require("ExtractToFunction"), WrapSelection = require("WrapSelection"), CommandManager = brackets.getModule("command/CommandManager"), - Menus = brackets.getModule("command/Menus"); + Menus = brackets.getModule("command/Menus"), + HealthLogger = brackets.getModule("utils/HealthLogger"), + _ = brackets.getModule("thirdparty/lodash"), + EditorManager = brackets.getModule("editor/EditorManager"); var jsRefactoringEnabled = true; @@ -66,6 +69,63 @@ define(function (require, exports, module) { jsRefactoringEnabled = _isRefactoringEnabled(); }); + function _handleRefactor(functionName) { + var eventName, eventType = ""; + + switch (functionName) { + case REFACTOR_RENAME: + eventName = REFACTOR_RENAME; + eventType = "rename"; + RenameIdentifier.handleRename(); + break; + case EXTRACTTO_VARIABLE: + eventName = EXTRACTTO_VARIABLE; + eventType = "extractToVariable"; + ExtractToVariable.handleExtractToVariable(); + break; + case EXTRACTTO_FUNCTION: + eventName = EXTRACTTO_FUNCTION; + eventType = "extractToFunction"; + ExtractToFunction.handleExtractToFunction(); + break; + case REFACTORWRAPINTRYCATCH: + eventName = REFACTORWRAPINTRYCATCH; + eventType = "tryCatch"; + WrapSelection.wrapInTryCatch(); + break; + case REFACTORWRAPINCONDITION: + eventName = REFACTORWRAPINCONDITION; + eventType = "wrapInCondition"; + WrapSelection.wrapInCondition(); + break; + case REFACTORCONVERTTOARROWFN: + eventName = REFACTORCONVERTTOARROWFN; + eventType = "convertToFunction"; + WrapSelection.convertToArrowFunction(); + break; + case REFACTORCREATEGETSET: + eventName = REFACTORCREATEGETSET; + eventType = "createGetterSetter"; + WrapSelection.createGettersAndSetters(); + break; + } + if (eventName) { + var editor = EditorManager.getActiveEditor(); + + // Logging should be done only when the context is javascript + if (!editor || editor.getModeForSelection() !== "javascript") { + return; + } + // Send analytics data for js refactoring + HealthLogger.sendAnalyticsData( + eventName, + "usage", + "jsRefactor", + eventType + ); + } + } + AppInit.appReady(function () { if (jsRefactoringEnabled) { @@ -76,34 +136,34 @@ define(function (require, exports, module) { Menus.getMenu(menuLocation).addMenuDivider(); // Rename Identifier - CommandManager.register(Strings.CMD_REFACTORING_RENAME, REFACTOR_RENAME, RenameIdentifier.handleRename); + CommandManager.register(Strings.CMD_REFACTORING_RENAME, REFACTOR_RENAME, _.partial(_handleRefactor, REFACTOR_RENAME)); subMenu.addMenuItem(REFACTOR_RENAME); Menus.getMenu(menuLocation).addMenuItem(REFACTOR_RENAME, KeyboardPrefs.renameIdentifier); // Extract to Variable - CommandManager.register(Strings.CMD_EXTRACTTO_VARIABLE, EXTRACTTO_VARIABLE, ExtractToVariable.handleExtractToVariable); + CommandManager.register(Strings.CMD_EXTRACTTO_VARIABLE, EXTRACTTO_VARIABLE, _.partial(_handleRefactor, EXTRACTTO_VARIABLE)); subMenu.addMenuItem(EXTRACTTO_VARIABLE); Menus.getMenu(menuLocation).addMenuItem(EXTRACTTO_VARIABLE, KeyboardPrefs.extractToVariable); // Extract to Function - CommandManager.register(Strings.CMD_EXTRACTTO_FUNCTION, EXTRACTTO_FUNCTION, ExtractToFunction.handleExtractToFunction); + CommandManager.register(Strings.CMD_EXTRACTTO_FUNCTION, EXTRACTTO_FUNCTION, _.partial(_handleRefactor, EXTRACTTO_FUNCTION)); subMenu.addMenuItem(EXTRACTTO_FUNCTION); Menus.getMenu(menuLocation).addMenuItem(EXTRACTTO_FUNCTION, KeyboardPrefs.extractToFunction); // Wrap Selection - CommandManager.register(Strings.CMD_REFACTORING_TRY_CATCH, REFACTORWRAPINTRYCATCH, WrapSelection.wrapInTryCatch); + CommandManager.register(Strings.CMD_REFACTORING_TRY_CATCH, REFACTORWRAPINTRYCATCH, _.partial(_handleRefactor, REFACTORWRAPINTRYCATCH)); subMenu.addMenuItem(REFACTORWRAPINTRYCATCH); Menus.getMenu(menuLocation).addMenuItem(REFACTORWRAPINTRYCATCH); - CommandManager.register(Strings.CMD_REFACTORING_CONDITION, REFACTORWRAPINCONDITION, WrapSelection.wrapInCondition); + CommandManager.register(Strings.CMD_REFACTORING_CONDITION, REFACTORWRAPINCONDITION, _.partial(_handleRefactor, REFACTORWRAPINCONDITION)); subMenu.addMenuItem(REFACTORWRAPINCONDITION); Menus.getMenu(menuLocation).addMenuItem(REFACTORWRAPINCONDITION); - CommandManager.register(Strings.CMD_REFACTORING_ARROW_FUNCTION, REFACTORCONVERTTOARROWFN, WrapSelection.convertToArrowFunction); + CommandManager.register(Strings.CMD_REFACTORING_ARROW_FUNCTION, REFACTORCONVERTTOARROWFN, _.partial(_handleRefactor, REFACTORCONVERTTOARROWFN)); subMenu.addMenuItem(REFACTORCONVERTTOARROWFN); Menus.getMenu(menuLocation).addMenuItem(REFACTORCONVERTTOARROWFN); - CommandManager.register(Strings.CMD_REFACTORING_GETTERS_SETTERS, REFACTORCREATEGETSET, WrapSelection.createGettersAndSetters); + CommandManager.register(Strings.CMD_REFACTORING_GETTERS_SETTERS, REFACTORCREATEGETSET, _.partial(_handleRefactor, REFACTORCREATEGETSET)); subMenu.addMenuItem(REFACTORCREATEGETSET); Menus.getMenu(menuLocation).addMenuItem(REFACTORCREATEGETSET); } diff --git a/src/extensions/default/MDNDocs/InlineDocsViewer.js b/src/extensions/default/MDNDocs/InlineDocsViewer.js index 25372e10507..d3ab81abd9c 100644 --- a/src/extensions/default/MDNDocs/InlineDocsViewer.js +++ b/src/extensions/default/MDNDocs/InlineDocsViewer.js @@ -33,7 +33,8 @@ define(function (require, exports, module) { InlineWidget = brackets.getModule("editor/InlineWidget").InlineWidget, KeyEvent = brackets.getModule("utils/KeyEvent"), Strings = brackets.getModule("strings"), - Mustache = brackets.getModule("thirdparty/mustache/mustache"); + Mustache = brackets.getModule("thirdparty/mustache/mustache"), + HealthLogger = brackets.getModule("utils/HealthLogger"); // Load template var inlineEditorTemplate = require("text!InlineDocsViewer.html"); @@ -73,6 +74,8 @@ define(function (require, exports, module) { this.$scroller = this.$wrapperDiv.find(".scroller"); this.$scroller.on("mousewheel", this._handleWheelScroll); + this.$moreinfo = this.$wrapperDiv.find(".more-info"); + this.$moreinfo.on("click", this._logAnalyticsData); this._onKeydown = this._onKeydown.bind(this); } @@ -191,6 +194,21 @@ define(function (require, exports, module) { InlineDocsViewer.prototype._sizeEditorToContent = function () { this.hostEditor.setInlineWidgetHeight(this, this.$wrapperDiv.height() + 20, true); }; + + /** + * Send analytics data for Quick Doc "readMore" action + * + * @return {boolean} false + */ + InlineDocsViewer.prototype._logAnalyticsData = function () { + HealthLogger.sendAnalyticsData( + "QuickDocReadMore", + "usage", + "quickDoc", + "readMore" + ); + return false; + }; module.exports = InlineDocsViewer; diff --git a/src/extensions/default/MDNDocs/main.js b/src/extensions/default/MDNDocs/main.js index 356347918c2..31d123176a1 100644 --- a/src/extensions/default/MDNDocs/main.js +++ b/src/extensions/default/MDNDocs/main.js @@ -31,7 +31,8 @@ define(function (require, exports, module) { FileUtils = brackets.getModule("file/FileUtils"), CSSUtils = brackets.getModule("language/CSSUtils"), HTMLUtils = brackets.getModule("language/HTMLUtils"), - ExtensionUtils = brackets.getModule("utils/ExtensionUtils"); + ExtensionUtils = brackets.getModule("utils/ExtensionUtils"), + HealthLogger = brackets.getModule("utils/HealthLogger"); // Extension modules var InlineDocsViewer = require("InlineDocsViewer"); @@ -102,6 +103,14 @@ define(function (require, exports, module) { return null; } + // Send analytics data for Quick Doc open + HealthLogger.sendAnalyticsData( + "cssQuickDoc", + "usage", + "quickDoc", + "open" + ); + // Only provide docs if the selection is within a single line var sel = hostEditor.getSelection(); if (sel.start.line !== sel.end.line) { diff --git a/src/preferences/PreferencesDialogs.js b/src/preferences/PreferencesDialogs.js index 65b6ddec391..8163ca2eea7 100644 --- a/src/preferences/PreferencesDialogs.js +++ b/src/preferences/PreferencesDialogs.js @@ -34,7 +34,8 @@ define(function (require, exports, module) { Strings = require("strings"), SettingsDialogTemplate = require("text!htmlContent/project-settings-dialog.html"), Mustache = require("thirdparty/mustache/mustache"), - PathUtils = require("thirdparty/path-utils/path-utils"); + PathUtils = require("thirdparty/path-utils/path-utils"), + HealthLogger = require("utils/HealthLogger"); /** * Validate that text string is a valid base url which should map to a server folder @@ -101,6 +102,13 @@ define(function (require, exports, module) { var baseUrlValue = $baseUrlControl.val(); var result = _validateBaseUrl(baseUrlValue); if (result === "") { + // Send analytics data when url is set in project settings + HealthLogger.sendAnalyticsData( + "projectSettingsLivepreview", + "usage", + "projectSettings", + "use" + ); ProjectManager.setBaseUrl(baseUrlValue); } else { // Re-invoke dialog with result (error message)