From d99515b1359161d2dd89ea68619fe3ed43959b0f Mon Sep 17 00:00:00 2001 From: Sorab Bisht Date: Wed, 25 Apr 2018 16:58:46 +0530 Subject: [PATCH 1/2] Adding Analytics logging for JSRefactor, Live Preview, Quick Edit and more features --- src/LiveDevelopment/LiveDevelopment.js | 11 ++- src/editor/CSSInlineEditor.js | 10 +++ src/editor/EditorStatusBar.js | 11 ++- .../default/JavaScriptQuickEdit/main.js | 11 ++- .../default/JavaScriptRefactoring/main.js | 70 ++++++++++++++++--- .../default/MDNDocs/InlineDocsViewer.js | 21 +++++- src/extensions/default/MDNDocs/main.js | 12 +++- src/preferences/PreferencesDialogs.js | 11 ++- 8 files changed, 143 insertions(+), 14 deletions(-) diff --git a/src/LiveDevelopment/LiveDevelopment.js b/src/LiveDevelopment/LiveDevelopment.js index 93cd81f16f9..49385e2b939 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 = brackets.getModule("utils/HealthLogger"); // Inspector var Inspector = require("LiveDevelopment/Inspector/Inspector"); @@ -1350,6 +1351,14 @@ 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..b704bb78bd6 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 = brackets.getModule("utils/HealthLogger"), _ = require("thirdparty/lodash"); var _newRuleCmd, @@ -169,6 +170,15 @@ 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..ef3f0fb2115 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 = brackets.getModule("utils/HealthLogger"); var SupportedEncodingsText = require("text!supported-encodings.json"), SupportedEncodings = JSON.parse(SupportedEncodingsText); @@ -174,6 +175,14 @@ 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..93b41b2abb3 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,14 @@ 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..4cf01530307 100644 --- a/src/extensions/default/JavaScriptRefactoring/main.js +++ b/src/extensions/default/JavaScriptRefactoring/main.js @@ -33,7 +33,9 @@ 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"); var jsRefactoringEnabled = true; @@ -66,6 +68,58 @@ 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) { + // Send analytics data for refactoring + HealthLogger.sendAnalyticsData( + eventName, + "usage", + "jsRefactor", + eventType, + "" + ); + } + } + AppInit.appReady(function () { if (jsRefactoringEnabled) { @@ -76,34 +130,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..9d444c537dd 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,22 @@ 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 {type} [[Description]] + */ + 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..3da69c447f2 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,15 @@ 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..c1285c22b6c 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 = brackets.getModule("utils/HealthLogger"); /** * Validate that text string is a valid base url which should map to a server folder @@ -101,6 +102,14 @@ 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.sendsendAnalyticsData( + "projectSettingsLivepreview", + "usage", + "projectSettings", + "use", + "" + ); ProjectManager.setBaseUrl(baseUrlValue); } else { // Re-invoke dialog with result (error message) From 894943cd9212f82b87ec71441517433c2e3d414b Mon Sep 17 00:00:00 2001 From: Sorab Bisht Date: Fri, 27 Apr 2018 16:40:19 +0530 Subject: [PATCH 2/2] Addressing review comments --- src/LiveDevelopment/LiveDevelopment.js | 5 ++--- src/editor/CSSInlineEditor.js | 5 ++--- src/editor/EditorStatusBar.js | 5 ++--- .../default/JavaScriptQuickEdit/main.js | 3 +-- .../default/JavaScriptRefactoring/main.js | 20 ++++++++++++------- .../default/MDNDocs/InlineDocsViewer.js | 5 ++--- src/extensions/default/MDNDocs/main.js | 3 +-- src/preferences/PreferencesDialogs.js | 7 +++---- 8 files changed, 26 insertions(+), 27 deletions(-) diff --git a/src/LiveDevelopment/LiveDevelopment.js b/src/LiveDevelopment/LiveDevelopment.js index 49385e2b939..22e677ae372 100644 --- a/src/LiveDevelopment/LiveDevelopment.js +++ b/src/LiveDevelopment/LiveDevelopment.js @@ -97,7 +97,7 @@ define(function LiveDevelopment(require, exports, module) { UserServer = require("LiveDevelopment/Servers/UserServer").UserServer, WebSocketTransport = require("LiveDevelopment/transports/WebSocketTransport"), PreferencesManager = require("preferences/PreferencesManager"), - HealthLogger = brackets.getModule("utils/HealthLogger"); + HealthLogger = require("utils/HealthLogger"); // Inspector var Inspector = require("LiveDevelopment/Inspector/Inspector"); @@ -1356,8 +1356,7 @@ define(function LiveDevelopment(require, exports, module) { "livePreviewOpen", "usage", "livePreview", - "open", - "" + "open" ); // Register user defined server provider and keep handlers for further clean-up diff --git a/src/editor/CSSInlineEditor.js b/src/editor/CSSInlineEditor.js index b704bb78bd6..e51a280f4d9 100644 --- a/src/editor/CSSInlineEditor.js +++ b/src/editor/CSSInlineEditor.js @@ -39,7 +39,7 @@ define(function (require, exports, module) { MultiRangeInlineEditor = require("editor/MultiRangeInlineEditor"), Strings = require("strings"), ViewUtils = require("utils/ViewUtils"), - HealthLogger = brackets.getModule("utils/HealthLogger"), + HealthLogger = require("utils/HealthLogger"), _ = require("thirdparty/lodash"); var _newRuleCmd, @@ -175,8 +175,7 @@ define(function (require, exports, module) { "QuickEditOpen", "usage", "quickEdit", - "open", - "" + "open" ); // Only provide CSS editor if the selection is within a single line diff --git a/src/editor/EditorStatusBar.js b/src/editor/EditorStatusBar.js index ef3f0fb2115..c3a53857fae 100644 --- a/src/editor/EditorStatusBar.js +++ b/src/editor/EditorStatusBar.js @@ -51,7 +51,7 @@ define(function (require, exports, module) { Commands = require("command/Commands"), DocumentManager = require("document/DocumentManager"), StringUtils = require("utils/StringUtils"), - HealthLogger = brackets.getModule("utils/HealthLogger"); + HealthLogger = require("utils/HealthLogger"); var SupportedEncodingsText = require("text!supported-encodings.json"), SupportedEncodings = JSON.parse(SupportedEncodingsText); @@ -180,8 +180,7 @@ define(function (require, exports, module) { "multiCursor", "usage", "multiCursor", - "use", - "" + "use" ); selStr = StringUtils.format(Strings.STATUSBAR_SELECTION_MULTIPLE, sels.length); } else if (editor.hasSelection()) { diff --git a/src/extensions/default/JavaScriptQuickEdit/main.js b/src/extensions/default/JavaScriptQuickEdit/main.js index 93b41b2abb3..2f1089dba48 100644 --- a/src/extensions/default/JavaScriptQuickEdit/main.js +++ b/src/extensions/default/JavaScriptQuickEdit/main.js @@ -202,8 +202,7 @@ define(function (require, exports, module) { "QuickEditOpen", "usage", "quickEdit", - "open", - "" + "open" ); // Only provide JavaScript editor if the selection is within a single line var sel = hostEditor.getSelection(); diff --git a/src/extensions/default/JavaScriptRefactoring/main.js b/src/extensions/default/JavaScriptRefactoring/main.js index 4cf01530307..429256fa2a4 100644 --- a/src/extensions/default/JavaScriptRefactoring/main.js +++ b/src/extensions/default/JavaScriptRefactoring/main.js @@ -35,7 +35,8 @@ define(function (require, exports, module) { CommandManager = brackets.getModule("command/CommandManager"), Menus = brackets.getModule("command/Menus"), HealthLogger = brackets.getModule("utils/HealthLogger"), - _ = brackets.getModule("thirdparty/lodash"); + _ = brackets.getModule("thirdparty/lodash"), + EditorManager = brackets.getModule("editor/EditorManager"); var jsRefactoringEnabled = true; @@ -69,9 +70,9 @@ define(function (require, exports, module) { }); function _handleRefactor(functionName) { - var eventName, - eventType = ""; - switch(functionName) { + var eventName, eventType = ""; + + switch (functionName) { case REFACTOR_RENAME: eventName = REFACTOR_RENAME; eventType = "rename"; @@ -109,13 +110,18 @@ define(function (require, exports, module) { break; } if (eventName) { - // Send analytics data for refactoring + 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, - "" + eventType ); } } diff --git a/src/extensions/default/MDNDocs/InlineDocsViewer.js b/src/extensions/default/MDNDocs/InlineDocsViewer.js index 9d444c537dd..d3ab81abd9c 100644 --- a/src/extensions/default/MDNDocs/InlineDocsViewer.js +++ b/src/extensions/default/MDNDocs/InlineDocsViewer.js @@ -198,15 +198,14 @@ define(function (require, exports, module) { /** * Send analytics data for Quick Doc "readMore" action * - * @return {type} [[Description]] + * @return {boolean} false */ InlineDocsViewer.prototype._logAnalyticsData = function () { HealthLogger.sendAnalyticsData( "QuickDocReadMore", "usage", "quickDoc", - "readMore", - "" + "readMore" ); return false; }; diff --git a/src/extensions/default/MDNDocs/main.js b/src/extensions/default/MDNDocs/main.js index 3da69c447f2..31d123176a1 100644 --- a/src/extensions/default/MDNDocs/main.js +++ b/src/extensions/default/MDNDocs/main.js @@ -108,8 +108,7 @@ define(function (require, exports, module) { "cssQuickDoc", "usage", "quickDoc", - "open", - "" + "open" ); // Only provide docs if the selection is within a single line diff --git a/src/preferences/PreferencesDialogs.js b/src/preferences/PreferencesDialogs.js index c1285c22b6c..8163ca2eea7 100644 --- a/src/preferences/PreferencesDialogs.js +++ b/src/preferences/PreferencesDialogs.js @@ -35,7 +35,7 @@ define(function (require, exports, module) { SettingsDialogTemplate = require("text!htmlContent/project-settings-dialog.html"), Mustache = require("thirdparty/mustache/mustache"), PathUtils = require("thirdparty/path-utils/path-utils"), - HealthLogger = brackets.getModule("utils/HealthLogger"); + HealthLogger = require("utils/HealthLogger"); /** * Validate that text string is a valid base url which should map to a server folder @@ -103,12 +103,11 @@ define(function (require, exports, module) { var result = _validateBaseUrl(baseUrlValue); if (result === "") { // Send analytics data when url is set in project settings - HealthLogger.sendsendAnalyticsData( + HealthLogger.sendAnalyticsData( "projectSettingsLivepreview", "usage", "projectSettings", - "use", - "" + "use" ); ProjectManager.setBaseUrl(baseUrlValue); } else {