From b7f4539cdb259406fe505a355d6d34951b8ce8b8 Mon Sep 17 00:00:00 2001
From: Victor Woeltjen <victor.woeltjen@nasa.gov>
Date: Mon, 26 Jan 2015 15:09:56 -0800
Subject: [PATCH] [Performance] Add watch indicator

Add a watch indicator to the example bundles as a
developer support tool. Added to help support sluggish
plots, WTD-717.
---
 example/profiling/bundle.json           | 10 ++++
 example/profiling/src/WatchIndicator.js | 75 +++++++++++++++++++++++++
 2 files changed, 85 insertions(+)
 create mode 100644 example/profiling/bundle.json
 create mode 100644 example/profiling/src/WatchIndicator.js

diff --git a/example/profiling/bundle.json b/example/profiling/bundle.json
new file mode 100644
index 0000000000..b6090717d2
--- /dev/null
+++ b/example/profiling/bundle.json
@@ -0,0 +1,10 @@
+{
+    "extensions": {
+        "indicators": [
+            {
+                "implementation": "WatchIndicator.js",
+                "depends": ["$interval", "$rootScope"]
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/example/profiling/src/WatchIndicator.js b/example/profiling/src/WatchIndicator.js
new file mode 100644
index 0000000000..61fa917984
--- /dev/null
+++ b/example/profiling/src/WatchIndicator.js
@@ -0,0 +1,75 @@
+/*global define*/
+
+define(
+    [],
+    function () {
+        "use strict";
+
+        /**
+         * Updates a count of currently-active Angular watches.
+         * @constructor
+         * @param $interval Angular's $interval
+         */
+        function WatchIndicator($interval, $rootScope) {
+            var watches = 0;
+
+            function count(scope) {
+                if (scope) {
+                    watches += (scope.$$watchers || []).length;
+                    count(scope.$$childHead);
+                    count(scope.$$nextSibling);
+                }
+            }
+
+            function update() {
+                watches = 0;
+                count($rootScope);
+            }
+
+            // Update state every second
+            $interval(update, 1000);
+
+            // Provide initial state, too
+            update();
+
+            return {
+                /**
+                 * Get the glyph (single character used as an icon)
+                 * to display in this indicator. This will return ".",
+                 * which should appear as a dataflow icon.
+                 * @returns {string} the character of the database icon
+                 */
+                getGlyph: function () {
+                    return "A";
+                },
+                /**
+                 * Get the name of the CSS class to apply to the glyph.
+                 * This is used to color the glyph to match its
+                 * state (one of ok, caution or err)
+                 * @returns {string} the CSS class to apply to this glyph
+                 */
+                getGlyphClass: function () {
+                    return undefined;
+                },
+                /**
+                 * Get the text that should appear in the indicator.
+                 * @returns {string} brief summary of connection status
+                 */
+                getText: function () {
+                    return "Watches " + watches;
+                },
+                /**
+                 * Get a longer-form description of the current connection
+                 * space, suitable for display in a tooltip
+                 * @returns {string} longer summary of connection status
+                 */
+                getDescription: function () {
+                    return "";
+                }
+            };
+        }
+
+        return WatchIndicator;
+
+    }
+);
\ No newline at end of file