From 48597039b24ffbc976572d24bfc0835922bce43b Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Thu, 11 Feb 2021 15:29:20 +0000
Subject: SL-14862 - LLViewerStats logs which UI features get used

---
 indra/llui/CMakeLists.txt       |  2 ++
 indra/llui/llfloaterreg.cpp     |  8 ++++++
 indra/llui/lluictrl.cpp         | 21 +++++++++++++-
 indra/llui/lluictrl.h           |  4 +++
 indra/llui/lluiusage.cpp        | 61 +++++++++++++++++++++++++++++++++++++++++
 indra/llui/lluiusage.h          | 49 +++++++++++++++++++++++++++++++++
 indra/newview/llviewerstats.cpp |  3 ++
 7 files changed, 147 insertions(+), 1 deletion(-)
 create mode 100644 indra/llui/lluiusage.cpp
 create mode 100644 indra/llui/lluiusage.h

(limited to 'indra')

diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt
index cce618487b..f781ff4110 100644
--- a/indra/llui/CMakeLists.txt
+++ b/indra/llui/CMakeLists.txt
@@ -122,6 +122,7 @@ set(llui_SOURCE_FILES
     lluictrl.cpp
     lluictrlfactory.cpp
     lluistring.cpp
+    lluiusage.cpp
     llundo.cpp
     llurlaction.cpp
     llurlentry.cpp
@@ -241,6 +242,7 @@ set(llui_HEADER_FILES
     llui.h
     lluicolor.h
     lluistring.h
+    lluiusage.h
     llundo.h
     llurlaction.h
     llurlentry.h
diff --git a/indra/llui/llfloaterreg.cpp b/indra/llui/llfloaterreg.cpp
index 85e07fc6a6..6307bf1028 100644
--- a/indra/llui/llfloaterreg.cpp
+++ b/indra/llui/llfloaterreg.cpp
@@ -32,6 +32,7 @@
 #include "llfloater.h"
 #include "llmultifloater.h"
 #include "llfloaterreglistener.h"
+#include "lluiusage.h"
 
 //*******************************************************
 
@@ -243,6 +244,8 @@ LLFloaterReg::const_instance_list_t& LLFloaterReg::getFloaterList(const std::str
 //static
 LLFloater* LLFloaterReg::showInstance(const std::string& name, const LLSD& key, BOOL focus) 
 {
+	LL_DEBUGS("UIUsage") << "floater showInstance " << name << LL_ENDL;
+	LLUIUsage::instance().logFloater(name);
 	if( sBlockShowFloaters
 			// see EXT-7090
 			&& sAlwaysShowableList.find(name) == sAlwaysShowableList.end())
@@ -273,6 +276,9 @@ bool LLFloaterReg::hideInstance(const std::string& name, const LLSD& key)
 // returns true if the instance is visible when completed
 bool LLFloaterReg::toggleInstance(const std::string& name, const LLSD& key)
 {
+	LL_DEBUGS("UIUsage") << "floater toggleInstance " << name << LL_ENDL;
+	LLUIUsage::instance().logFloater(name);
+
 	LLFloater* instance = findInstance(name, key); 
 	if (LLFloater::isShown(instance))
 	{
@@ -473,6 +479,8 @@ void LLFloaterReg::toggleInstanceOrBringToFront(const LLSD& sdname, const LLSD&
 	LLFloater* instance = getInstance(name, key); 
 	
 
+	LL_DEBUGS("UIUsage") << "floater toggleInstanceOrBringToFront " << name << LL_ENDL;
+	LLUIUsage::instance().logFloater(name);
 	if (!instance)
 	{
 		LL_DEBUGS() << "Unable to get instance of floater '" << name << "'" << LL_ENDL;
diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp
index 544a76e8d5..0e1c8439ea 100644
--- a/indra/llui/lluictrl.cpp
+++ b/indra/llui/lluictrl.cpp
@@ -35,6 +35,7 @@
 #include "lluictrlfactory.h"
 #include "lltabcontainer.h"
 #include "llaccordionctrltab.h"
+#include "lluiusage.h"
 
 static LLDefaultChildRegistry::Register<LLUICtrl> r("ui_ctrl");
 
@@ -282,6 +283,7 @@ LLUICtrl::commit_signal_t::slot_type LLUICtrl::initCommitCallback(const CommitCa
 	else
 	{
 		std::string function_name = cb.function_name;
+		setFunctionName(function_name);
 		commit_callback_t* func = (CommitCallbackRegistry::getValue(function_name));
 		if (func)
 		{
@@ -422,7 +424,18 @@ BOOL LLUICtrl::canFocusChildren() const
 void LLUICtrl::onCommit()
 {
 	if (mCommitSignal)
-	(*mCommitSignal)(this, getValue());
+	{
+		if (!mFunctionName.empty())
+		{
+			LL_DEBUGS("UIUsage") << "calling commit function " << mFunctionName << LL_ENDL;
+			LLUIUsage::instance().logCommand(mFunctionName);
+		}
+		else
+		{
+			//LL_DEBUGS("UIUsage") << "calling commit function " << "UNKNOWN" << LL_ENDL;
+		}
+		(*mCommitSignal)(this, getValue());
+	}
 }
 
 //virtual
@@ -597,6 +610,12 @@ void LLUICtrl::setMakeInvisibleControlVariable(LLControlVariable* control)
 		setVisible(!(mMakeInvisibleControlVariable->getValue().asBoolean()));
 	}
 }
+
+void LLUICtrl::setFunctionName(const std::string& function_name)
+{
+	mFunctionName = function_name;
+}
+
 // static
 bool LLUICtrl::controlListener(const LLSD& newvalue, LLHandle<LLUICtrl> handle, std::string type)
 {
diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h
index 7360bd7659..67dd24341c 100644
--- a/indra/llui/lluictrl.h
+++ b/indra/llui/lluictrl.h
@@ -183,6 +183,8 @@ public:
 	void setMakeVisibleControlVariable(LLControlVariable* control);
 	void setMakeInvisibleControlVariable(LLControlVariable* control);
 
+	void setFunctionName(const std::string& function_name);
+	
 	virtual void	setTentative(BOOL b);
 	virtual BOOL	getTentative() const;
 	virtual void	setValue(const LLSD& value);
@@ -310,6 +312,8 @@ protected:
 	LLControlVariable* mMakeInvisibleControlVariable;
 	boost::signals2::connection mMakeInvisibleControlConnection;
 
+	std::string mFunctionName;
+
 	static F32 sActiveControlTransparency;
 	static F32 sInactiveControlTransparency;
 	
diff --git a/indra/llui/lluiusage.cpp b/indra/llui/lluiusage.cpp
new file mode 100644
index 0000000000..e1237031cd
--- /dev/null
+++ b/indra/llui/lluiusage.cpp
@@ -0,0 +1,61 @@
+/**
+* @file lluiuisage.cpp
+* @brief Source file for LLUIUsage
+*
+* $LicenseInfo:firstyear=2021&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2021, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+* $/LicenseInfo$
+*/
+
+#include "linden_common.h"
+#include "lluiusage.h"
+
+LLUIUsage::LLUIUsage()
+{
+}
+
+LLUIUsage::~LLUIUsage()
+{
+}
+
+void LLUIUsage::logFloater(const std::string& floater)
+{
+	mFloaterCounts[floater]++;
+}
+
+void LLUIUsage::logCommand(const std::string& command)
+{
+	mCommandCounts[command]++;
+}
+
+LLSD LLUIUsage::asLLSD() const
+{
+	LLSD result;
+	for (auto const& it : mFloaterCounts)
+	{
+		result["floaters"][it.first] = LLSD::Integer(it.second);
+	}
+	for (auto const& it : mCommandCounts)
+	{
+		result["commands"][it.first] = LLSD::Integer(it.second);
+	}
+	return result;
+}
+
diff --git a/indra/llui/lluiusage.h b/indra/llui/lluiusage.h
new file mode 100644
index 0000000000..0c076c2b2c
--- /dev/null
+++ b/indra/llui/lluiusage.h
@@ -0,0 +1,49 @@
+/**
+* @file lluiuisage.h
+* @brief Header file for LLUIUsage
+*
+* $LicenseInfo:firstyear=2021&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2021, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+* $/LicenseInfo$
+*/
+
+#ifndef LL_LLUIUSAGE_H
+#define LL_LLUIUSAGE_H
+
+#include <map>
+#include "llsd.h"
+#include "llsingleton.h"
+
+// UIUsage tracking to see which operations and UI elements are most popular in a session
+class LLUIUsage : public LLSingleton<LLUIUsage>
+{
+public:
+	LLSINGLETON(LLUIUsage);
+	~LLUIUsage();
+public:
+	void logFloater(const std::string& floater);
+	void logCommand(const std::string& command);
+	LLSD asLLSD() const;
+private:
+	std::map<std::string,U32> mFloaterCounts;
+	std::map<std::string,U32> mCommandCounts;
+};
+
+#endif // LLUIUIUSAGE.h
diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index 05f88b0a75..314c1a1f1e 100644
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -63,6 +63,7 @@
 #include "llsdutil.h"
 #include "llcorehttputil.h"
 #include "llvoicevivox.h"
+#include "lluiusage.h"
 
 namespace LLStatViewer
 {
@@ -577,6 +578,8 @@ void send_viewer_stats(bool include_preferences)
 	fail["invalid"] = (S32) gMessageSystem->mInvalidOnCircuitPackets;
 	fail["missing_updater"] = (S32) LLAppViewer::instance()->isUpdaterMissing();
 
+	body["ui"] = LLUIUsage::instance().asLLSD();
+		
 	body["stats"]["voice"] = LLVoiceVivoxStats::getInstance()->read();
 
 	// Misc stats, two strings and two ints
-- 
cgit v1.2.3


From 8a718a9ca28a7a544c7622a033fcd2791935909d Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Thu, 11 Feb 2021 16:05:46 +0000
Subject: SL-14862 - line endings fix, avoid period in key names

---
 indra/llui/lluiusage.cpp | 131 +++++++++++++++++++++++++----------------------
 indra/llui/lluiusage.h   |  99 +++++++++++++++++------------------
 2 files changed, 120 insertions(+), 110 deletions(-)

(limited to 'indra')

diff --git a/indra/llui/lluiusage.cpp b/indra/llui/lluiusage.cpp
index e1237031cd..50eeccd214 100644
--- a/indra/llui/lluiusage.cpp
+++ b/indra/llui/lluiusage.cpp
@@ -1,61 +1,70 @@
-/**
-* @file lluiuisage.cpp
-* @brief Source file for LLUIUsage
-*
-* $LicenseInfo:firstyear=2021&license=viewerlgpl$
-* Second Life Viewer Source Code
-* Copyright (C) 2021, Linden Research, Inc.
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public
-* License as published by the Free Software Foundation;
-* version 2.1 of the License only.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this library; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-*
-* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
-* $/LicenseInfo$
-*/
-
-#include "linden_common.h"
-#include "lluiusage.h"
-
-LLUIUsage::LLUIUsage()
-{
-}
-
-LLUIUsage::~LLUIUsage()
-{
-}
-
-void LLUIUsage::logFloater(const std::string& floater)
-{
-	mFloaterCounts[floater]++;
-}
-
-void LLUIUsage::logCommand(const std::string& command)
-{
-	mCommandCounts[command]++;
-}
-
-LLSD LLUIUsage::asLLSD() const
-{
-	LLSD result;
-	for (auto const& it : mFloaterCounts)
-	{
-		result["floaters"][it.first] = LLSD::Integer(it.second);
-	}
-	for (auto const& it : mCommandCounts)
-	{
-		result["commands"][it.first] = LLSD::Integer(it.second);
-	}
-	return result;
-}
-
+/**
+* @file lluiuisage.cpp
+* @brief Source file for LLUIUsage
+*
+* $LicenseInfo:firstyear=2021&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2021, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+* $/LicenseInfo$
+*/
+
+#include "linden_common.h"
+#include "lluiusage.h"
+
+LLUIUsage::LLUIUsage()
+{
+}
+
+LLUIUsage::~LLUIUsage()
+{
+}
+
+// static
+std::string LLUIUsage::sanitized(const std::string& s)
+{
+	// ViewerStats db doesn't like "." in keys
+	std::string result(s);
+	std::replace(result.begin(), result.end(), '.', '_');
+	return result;
+}
+
+void LLUIUsage::logFloater(const std::string& floater)
+{
+	mFloaterCounts[sanitized(floater)]++;
+}
+
+void LLUIUsage::logCommand(const std::string& command)
+{
+	mCommandCounts[sanitized(command)]++;
+}
+
+LLSD LLUIUsage::asLLSD() const
+{
+	LLSD result;
+	for (auto const& it : mFloaterCounts)
+	{
+		result["floaters"][it.first] = LLSD::Integer(it.second);
+	}
+	for (auto const& it : mCommandCounts)
+	{
+		result["commands"][it.first] = LLSD::Integer(it.second);
+	}
+	return result;
+}
+
diff --git a/indra/llui/lluiusage.h b/indra/llui/lluiusage.h
index 0c076c2b2c..bac607aa60 100644
--- a/indra/llui/lluiusage.h
+++ b/indra/llui/lluiusage.h
@@ -1,49 +1,50 @@
-/**
-* @file lluiuisage.h
-* @brief Header file for LLUIUsage
-*
-* $LicenseInfo:firstyear=2021&license=viewerlgpl$
-* Second Life Viewer Source Code
-* Copyright (C) 2021, Linden Research, Inc.
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public
-* License as published by the Free Software Foundation;
-* version 2.1 of the License only.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this library; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-*
-* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
-* $/LicenseInfo$
-*/
-
-#ifndef LL_LLUIUSAGE_H
-#define LL_LLUIUSAGE_H
-
-#include <map>
-#include "llsd.h"
-#include "llsingleton.h"
-
-// UIUsage tracking to see which operations and UI elements are most popular in a session
-class LLUIUsage : public LLSingleton<LLUIUsage>
-{
-public:
-	LLSINGLETON(LLUIUsage);
-	~LLUIUsage();
-public:
-	void logFloater(const std::string& floater);
-	void logCommand(const std::string& command);
-	LLSD asLLSD() const;
-private:
-	std::map<std::string,U32> mFloaterCounts;
-	std::map<std::string,U32> mCommandCounts;
-};
-
-#endif // LLUIUIUSAGE.h
+/**
+* @file lluiuisage.h
+* @brief Header file for LLUIUsage
+*
+* $LicenseInfo:firstyear=2021&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2021, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+* $/LicenseInfo$
+*/
+
+#ifndef LL_LLUIUSAGE_H
+#define LL_LLUIUSAGE_H
+
+#include <map>
+#include "llsd.h"
+#include "llsingleton.h"
+
+// UIUsage tracking to see which operations and UI elements are most popular in a session
+class LLUIUsage : public LLSingleton<LLUIUsage>
+{
+public:
+	LLSINGLETON(LLUIUsage);
+	~LLUIUsage();
+public:
+	static std::string sanitized(const std::string& s);
+	void logFloater(const std::string& floater);
+	void logCommand(const std::string& command);
+	LLSD asLLSD() const;
+private:
+	std::map<std::string,U32> mFloaterCounts;
+	std::map<std::string,U32> mCommandCounts;
+};
+
+#endif // LLUIUIUSAGE.h
-- 
cgit v1.2.3


From d15156d4e091ee7a095df70cfda04fea4ee2935a Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Thu, 18 Feb 2021 14:24:54 +0000
Subject: SL-14862 - catching more commands in LLUIUsage

---
 indra/llui/lltoolbar.cpp | 4 ++++
 1 file changed, 4 insertions(+)

(limited to 'indra')

diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp
index e6f466ec78..4868c66d1b 100644
--- a/indra/llui/lltoolbar.cpp
+++ b/indra/llui/lltoolbar.cpp
@@ -967,6 +967,8 @@ LLToolBarButton* LLToolBar::createButton(const LLCommandId& id)
 			executeStopParam.function_name = executeStopFunction;
 			executeStopParam.parameter = commandp->executeStopParameters();
 			LLUICtrl::commit_callback_t execute_func = initCommitCallback(executeParam);
+			button->setFunctionName(commandp->executeFunctionName());
+			LL_DEBUGS("UIUsage") << "button function name a -> " << commandp->executeFunctionName() << LL_ENDL;
 			LLUICtrl::commit_callback_t stop_func = initCommitCallback(executeStopParam);
 			
 			button->setMouseDownCallback(boost::bind(&LLToolBarButton::callIfEnabled, button, execute_func, _1, _2));
@@ -974,6 +976,8 @@ LLToolBarButton* LLToolBar::createButton(const LLCommandId& id)
 		}
 		else
 		{
+			button->setFunctionName(commandp->executeFunctionName());
+			LL_DEBUGS("UIUsage") << "button function name b -> " << commandp->executeFunctionName() << LL_ENDL;
 			button->setCommitCallback(executeParam);
 		}
 
-- 
cgit v1.2.3


From dd89dec893411c22d4916de14593a56f87d3a284 Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Mon, 1 Mar 2021 21:38:46 +0000
Subject: SL-14862 - more types of UI usage logs

---
 indra/llui/llbutton.cpp                 |  8 ++++++++
 indra/llui/lluictrl.cpp                 |  1 +
 indra/llui/lluiusage.cpp                | 12 ++++++++++++
 indra/llui/lluiusage.h                  |  2 ++
 indra/newview/llchatbar.cpp             |  3 +++
 indra/newview/llfloaterimnearbychat.cpp |  2 ++
 indra/newview/llworldmipmap.cpp         |  2 ++
 7 files changed, 30 insertions(+)

(limited to 'indra')

diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index 9682c3bc10..3a3d9254fd 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -47,6 +47,7 @@
 #include "llnotificationsutil.h"
 #include "llrender.h"
 #include "lluictrlfactory.h"
+#include "lluiusage.h"
 #include "llhelp.h"
 #include "lldockablefloater.h"
 #include "llviewereventrecorder.h"
@@ -437,6 +438,13 @@ BOOL LLButton::handleMouseDown(S32 x, S32 y, MASK mask)
 			setFocus(TRUE);
 		}
 
+		if (!mFunctionName.empty())
+		{
+			LL_DEBUGS("UIUsage") << "calling mouse down function " << mFunctionName << LL_ENDL;
+			LLUIUsage::instance().logCommand(mFunctionName);
+			LLUIUsage::instance().logWidget(getPathname());
+		}
+
 		/*
 		 * ATTENTION! This call fires another mouse down callback.
 		 * If you wish to remove this call emit that signal directly
diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp
index 0e1c8439ea..426c931d07 100644
--- a/indra/llui/lluictrl.cpp
+++ b/indra/llui/lluictrl.cpp
@@ -429,6 +429,7 @@ void LLUICtrl::onCommit()
 		{
 			LL_DEBUGS("UIUsage") << "calling commit function " << mFunctionName << LL_ENDL;
 			LLUIUsage::instance().logCommand(mFunctionName);
+			LLUIUsage::instance().logWidget(getPathname());
 		}
 		else
 		{
diff --git a/indra/llui/lluiusage.cpp b/indra/llui/lluiusage.cpp
index 50eeccd214..99de4ff78a 100644
--- a/indra/llui/lluiusage.cpp
+++ b/indra/llui/lluiusage.cpp
@@ -47,11 +47,19 @@ std::string LLUIUsage::sanitized(const std::string& s)
 void LLUIUsage::logFloater(const std::string& floater)
 {
 	mFloaterCounts[sanitized(floater)]++;
+	LL_DEBUGS("UIUsage") << "floater " << floater << LL_ENDL;
 }
 
 void LLUIUsage::logCommand(const std::string& command)
 {
 	mCommandCounts[sanitized(command)]++;
+	LL_DEBUGS("UIUsage") << "command " << command << LL_ENDL;
+}
+
+void LLUIUsage::logWidget(const std::string& w)
+{
+	mWidgetCounts[sanitized(w)]++;
+	LL_DEBUGS("UIUsage") << "widget " << w << LL_ENDL;
 }
 
 LLSD LLUIUsage::asLLSD() const
@@ -65,6 +73,10 @@ LLSD LLUIUsage::asLLSD() const
 	{
 		result["commands"][it.first] = LLSD::Integer(it.second);
 	}
+	for (auto const& it : mWidgetCounts)
+	{
+		result["widgets"][it.first] = LLSD::Integer(it.second);
+	}
 	return result;
 }
 
diff --git a/indra/llui/lluiusage.h b/indra/llui/lluiusage.h
index bac607aa60..efc8bb4032 100644
--- a/indra/llui/lluiusage.h
+++ b/indra/llui/lluiusage.h
@@ -41,10 +41,12 @@ public:
 	static std::string sanitized(const std::string& s);
 	void logFloater(const std::string& floater);
 	void logCommand(const std::string& command);
+	void logWidget(const std::string& w);
 	LLSD asLLSD() const;
 private:
 	std::map<std::string,U32> mFloaterCounts;
 	std::map<std::string,U32> mCommandCounts;
+	std::map<std::string,U32> mWidgetCounts;
 };
 
 #endif // LLUIUIUSAGE.h
diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp
index 3ab5c669c4..e400609a74 100644
--- a/indra/newview/llchatbar.cpp
+++ b/indra/newview/llchatbar.cpp
@@ -58,6 +58,7 @@
 #include "llmultigesture.h"
 #include "llui.h"
 #include "lluictrlfactory.h"
+#include "lluiusage.h"
 
 //
 // Globals
@@ -566,6 +567,8 @@ void LLChatBar::sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL
 	// as soon as we say something, we no longer care about teaching the user
 	// how to chat
 	gWarningSettings.setBOOL("FirstOtherChatBeforeUser", FALSE);
+
+	LLUIUsage::instance().logCommand("Chat.Send"); // Pseudo-command
 	
 	// Look for "/20 foo" channel chats.
 	S32 channel = 0;
diff --git a/indra/newview/llfloaterimnearbychat.cpp b/indra/newview/llfloaterimnearbychat.cpp
index a6531ed7e1..3a850d4b68 100644
--- a/indra/newview/llfloaterimnearbychat.cpp
+++ b/indra/newview/llfloaterimnearbychat.cpp
@@ -67,6 +67,7 @@
 #include "llviewerchat.h"
 #include "lltranslate.h"
 #include "llautoreplace.h"
+#include "lluiusage.h"
 
 S32 LLFloaterIMNearbyChat::sLastSpecialChatChannel = 0;
 
@@ -697,6 +698,7 @@ void LLFloaterIMNearbyChat::sendChatFromViewer(const std::string &utf8text, ECha
 
 void LLFloaterIMNearbyChat::sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL animate)
 {
+	LLUIUsage::instance().logCommand("Chat.Send"); // pseuo-command
 	// Look for "/20 foo" channel chats.
 	S32 channel = 0;
 	LLWString out_text = stripChannelNumber(wtext, &channel);
diff --git a/indra/newview/llworldmipmap.cpp b/indra/newview/llworldmipmap.cpp
index a2e519a61a..040d0deaf3 100644
--- a/indra/newview/llworldmipmap.cpp
+++ b/indra/newview/llworldmipmap.cpp
@@ -190,6 +190,8 @@ LLPointer<LLViewerFetchedTexture> LLWorldMipmap::loadObjectsTile(U32 grid_x, U32
 	//LL_INFOS("WorldMap") << "LLWorldMipmap::loadObjectsTile(), URL = " << imageurl << LL_ENDL;
 
 	LLPointer<LLViewerFetchedTexture> img = LLViewerTextureManager::getFetchedTextureFromUrl(imageurl, FTT_MAP_TILE, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+	LL_INFOS("MAPURL") << "fetching map tile from " << imageurl << LL_ENDL;
+
 	img->setBoostLevel(LLGLTexture::BOOST_MAP);
 
 	// Return the smart pointer
-- 
cgit v1.2.3


From 89bd4269018fa5a36a15eac8d2c3f99674d18b2d Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Wed, 10 Mar 2021 16:23:20 +0000
Subject: SL-14862 - use nested LLSD for widget info, condensed to the two
 leaf-most elements of the path. Simplified floater logging.

---
 indra/llui/llfloater.cpp          |  2 ++
 indra/llui/llfloaterreg.cpp       |  8 --------
 indra/llui/lluiusage.cpp          | 33 ++++++++++++++++++++++++++++++++-
 indra/llui/lluiusage.h            |  1 +
 indra/newview/llviewermessage.cpp |  1 -
 5 files changed, 35 insertions(+), 10 deletions(-)

(limited to 'indra')

diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index e9c980ad9a..c03b024dd5 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -58,6 +58,7 @@
 #include "llhelp.h"
 #include "llmultifloater.h"
 #include "llsdutil.h"
+#include "lluiusage.h"
 #include <boost/foreach.hpp>
 
 
@@ -1631,6 +1632,7 @@ void LLFloater::bringToFront( S32 x, S32 y )
 // virtual
 void LLFloater::setVisibleAndFrontmost(BOOL take_focus,const LLSD& key)
 {
+	LLUIUsage::instance().logFloater(getInstanceName());
 	LLMultiFloater* hostp = getHost();
 	if (hostp)
 	{
diff --git a/indra/llui/llfloaterreg.cpp b/indra/llui/llfloaterreg.cpp
index 6307bf1028..7c0933f554 100644
--- a/indra/llui/llfloaterreg.cpp
+++ b/indra/llui/llfloaterreg.cpp
@@ -244,8 +244,6 @@ LLFloaterReg::const_instance_list_t& LLFloaterReg::getFloaterList(const std::str
 //static
 LLFloater* LLFloaterReg::showInstance(const std::string& name, const LLSD& key, BOOL focus) 
 {
-	LL_DEBUGS("UIUsage") << "floater showInstance " << name << LL_ENDL;
-	LLUIUsage::instance().logFloater(name);
 	if( sBlockShowFloaters
 			// see EXT-7090
 			&& sAlwaysShowableList.find(name) == sAlwaysShowableList.end())
@@ -276,9 +274,6 @@ bool LLFloaterReg::hideInstance(const std::string& name, const LLSD& key)
 // returns true if the instance is visible when completed
 bool LLFloaterReg::toggleInstance(const std::string& name, const LLSD& key)
 {
-	LL_DEBUGS("UIUsage") << "floater toggleInstance " << name << LL_ENDL;
-	LLUIUsage::instance().logFloater(name);
-
 	LLFloater* instance = findInstance(name, key); 
 	if (LLFloater::isShown(instance))
 	{
@@ -478,9 +473,6 @@ void LLFloaterReg::toggleInstanceOrBringToFront(const LLSD& sdname, const LLSD&
 	std::string name = sdname.asString();
 	LLFloater* instance = getInstance(name, key); 
 	
-
-	LL_DEBUGS("UIUsage") << "floater toggleInstanceOrBringToFront " << name << LL_ENDL;
-	LLUIUsage::instance().logFloater(name);
 	if (!instance)
 	{
 		LL_DEBUGS() << "Unable to get instance of floater '" << name << "'" << LL_ENDL;
diff --git a/indra/llui/lluiusage.cpp b/indra/llui/lluiusage.cpp
index 99de4ff78a..824c59730b 100644
--- a/indra/llui/lluiusage.cpp
+++ b/indra/llui/lluiusage.cpp
@@ -26,6 +26,7 @@
 
 #include "linden_common.h"
 #include "lluiusage.h"
+#include <boost/algorithm/string.hpp>
 
 LLUIUsage::LLUIUsage()
 {
@@ -41,9 +42,39 @@ std::string LLUIUsage::sanitized(const std::string& s)
 	// ViewerStats db doesn't like "." in keys
 	std::string result(s);
 	std::replace(result.begin(), result.end(), '.', '_');
+	std::replace(result.begin(), result.end(), ' ', '_');
 	return result;
 }
 
+void LLUIUsage::setLLSDNested(LLSD& sd, const std::string& path, S32 max_elts, S32 val) const
+{
+	std::vector<std::string> fields;
+	boost::split(fields, path, boost::is_any_of("/"));
+	auto first_pos = std::max(fields.begin(), fields.end() - max_elts);
+	auto end_pos = fields.end();
+	std::vector<std::string> last_fields(first_pos,end_pos);
+
+	// Code below is just to accomplish the equivalent of
+	//   sd[last_fields[0]][last_fields[1]] = LLSD::Integer(val);
+	// for an arbitrary number of fields.
+	LLSD* fsd = &sd;
+	for (auto it=last_fields.begin(); it!=last_fields.end(); ++it)
+	{
+		if (it == last_fields.end()-1)
+		{
+			(*fsd)[*it] = LLSD::Integer(val);
+		}
+		else
+		{
+			if (!(*fsd)[*it].isMap())
+			{
+				(*fsd)[*it] = LLSD::emptyMap();
+			}
+			fsd = &(*fsd)[*it];
+		}
+	}
+}
+
 void LLUIUsage::logFloater(const std::string& floater)
 {
 	mFloaterCounts[sanitized(floater)]++;
@@ -75,7 +106,7 @@ LLSD LLUIUsage::asLLSD() const
 	}
 	for (auto const& it : mWidgetCounts)
 	{
-		result["widgets"][it.first] = LLSD::Integer(it.second);
+		setLLSDNested(result["widgets"], it.first, 2, it.second);
 	}
 	return result;
 }
diff --git a/indra/llui/lluiusage.h b/indra/llui/lluiusage.h
index efc8bb4032..956e184edc 100644
--- a/indra/llui/lluiusage.h
+++ b/indra/llui/lluiusage.h
@@ -39,6 +39,7 @@ public:
 	~LLUIUsage();
 public:
 	static std::string sanitized(const std::string& s);
+	void setLLSDNested(LLSD& sd, const std::string& path, S32 max_elts, S32 val) const;
 	void logFloater(const std::string& floater);
 	void logCommand(const std::string& command);
 	void logWidget(const std::string& w);
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 458fc3b13d..0d1b074743 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -116,7 +116,6 @@
 #include "llviewerregion.h"
 #include "llfloaterregionrestarting.h"
 
-#include <boost/algorithm/string/split.hpp> //
 #include <boost/foreach.hpp>
 
 #include "llnotificationmanager.h" //
-- 
cgit v1.2.3


From 92a17bf53b33050402c292c22614b361dba0e292 Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Wed, 10 Mar 2021 17:49:06 +0000
Subject: SL-14862 - tab logging

---
 indra/llui/lltabcontainer.cpp |  3 +++
 indra/llui/lluiusage.cpp      | 27 ++++++++++++++++++++++++---
 indra/llui/lluiusage.h        |  7 +++++--
 indra/newview/llstartup.cpp   |  3 +++
 4 files changed, 35 insertions(+), 5 deletions(-)

(limited to 'indra')

diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index e6b43da8e5..459fdcf2ae 100644
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -38,6 +38,7 @@
 #include "llrender.h"
 #include "llfloater.h"
 #include "lltrans.h"
+#include "lluiusage.h"
 
 //----------------------------------------------------------------------------
 
@@ -1556,6 +1557,8 @@ BOOL LLTabContainer::setTab(S32 which)
 			
 			if (is_selected)
 			{
+				LLUIUsage::instance().logPanel(tuple->mTabPanel->getName());
+
 				// Make sure selected tab is within scroll region
 				if (mIsVertical)
 				{
diff --git a/indra/llui/lluiusage.cpp b/indra/llui/lluiusage.cpp
index 824c59730b..c0d945438f 100644
--- a/indra/llui/lluiusage.cpp
+++ b/indra/llui/lluiusage.cpp
@@ -75,16 +75,22 @@ void LLUIUsage::setLLSDNested(LLSD& sd, const std::string& path, S32 max_elts, S
 	}
 }
 
+void LLUIUsage::logCommand(const std::string& command)
+{
+	mCommandCounts[sanitized(command)]++;
+	LL_DEBUGS("UIUsage") << "command " << command << LL_ENDL;
+}
+
 void LLUIUsage::logFloater(const std::string& floater)
 {
 	mFloaterCounts[sanitized(floater)]++;
 	LL_DEBUGS("UIUsage") << "floater " << floater << LL_ENDL;
 }
 
-void LLUIUsage::logCommand(const std::string& command)
+void LLUIUsage::logPanel(const std::string& p)
 {
-	mCommandCounts[sanitized(command)]++;
-	LL_DEBUGS("UIUsage") << "command " << command << LL_ENDL;
+	mPanelCounts[sanitized(p)]++;
+	LL_DEBUGS("UIUsage") << "panel " << p << LL_ENDL;
 }
 
 void LLUIUsage::logWidget(const std::string& w)
@@ -104,6 +110,10 @@ LLSD LLUIUsage::asLLSD() const
 	{
 		result["commands"][it.first] = LLSD::Integer(it.second);
 	}
+	for (auto const& it : mPanelCounts)
+	{
+		result["panels"][it.first] = LLSD::Integer(it.second);
+	}
 	for (auto const& it : mWidgetCounts)
 	{
 		setLLSDNested(result["widgets"], it.first, 2, it.second);
@@ -111,3 +121,14 @@ LLSD LLUIUsage::asLLSD() const
 	return result;
 }
 
+// Clear up some junk content generated during initial login/UI initialization
+void LLUIUsage::clear()
+{
+
+	LL_DEBUGS("UIUsage") << "clear" << LL_ENDL;
+	mCommandCounts.clear();
+	mFloaterCounts.clear();
+	mPanelCounts.clear();
+	mWidgetCounts.clear();
+}
+
diff --git a/indra/llui/lluiusage.h b/indra/llui/lluiusage.h
index 956e184edc..df7360c210 100644
--- a/indra/llui/lluiusage.h
+++ b/indra/llui/lluiusage.h
@@ -40,13 +40,16 @@ public:
 public:
 	static std::string sanitized(const std::string& s);
 	void setLLSDNested(LLSD& sd, const std::string& path, S32 max_elts, S32 val) const;
-	void logFloater(const std::string& floater);
 	void logCommand(const std::string& command);
+	void logFloater(const std::string& floater);
+	void logPanel(const std::string& p);
 	void logWidget(const std::string& w);
 	LLSD asLLSD() const;
+	void clear();
 private:
-	std::map<std::string,U32> mFloaterCounts;
 	std::map<std::string,U32> mCommandCounts;
+	std::map<std::string,U32> mFloaterCounts;
+	std::map<std::string,U32> mPanelCounts;
 	std::map<std::string,U32> mWidgetCounts;
 };
 
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 17777c3ceb..b458582fa8 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -142,6 +142,7 @@
 #include "lltoolmgr.h"
 #include "lltrans.h"
 #include "llui.h"
+#include "lluiusage.h"
 #include "llurldispatcher.h"
 #include "llurlentry.h"
 #include "llslurl.h"
@@ -2257,6 +2258,8 @@ bool idle_startup()
 
 		gAgentAvatarp->sendHoverHeight();
 
+		LLUIUsage::instance().clear();
+
 		return TRUE;
 	}
 
-- 
cgit v1.2.3


From e3babd1f8d6d5347f9cf1ec5fee976718e0c6a44 Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Thu, 11 Mar 2021 14:26:36 +0000
Subject: SL-14862 - more generalized LLSD funcs

---
 indra/llui/lluiusage.cpp | 26 ++++++++++++++++++--------
 indra/llui/lluiusage.h   |  3 ++-
 2 files changed, 20 insertions(+), 9 deletions(-)

(limited to 'indra')

diff --git a/indra/llui/lluiusage.cpp b/indra/llui/lluiusage.cpp
index c0d945438f..60c124b711 100644
--- a/indra/llui/lluiusage.cpp
+++ b/indra/llui/lluiusage.cpp
@@ -46,23 +46,33 @@ std::string LLUIUsage::sanitized(const std::string& s)
 	return result;
 }
 
-void LLUIUsage::setLLSDNested(LLSD& sd, const std::string& path, S32 max_elts, S32 val) const
+// static
+void LLUIUsage::setLLSDPath(LLSD& sd, const std::string& path, S32 max_elts, const LLSD& val)
 {
+	// Keep the last max_elts components of the specified path
 	std::vector<std::string> fields;
 	boost::split(fields, path, boost::is_any_of("/"));
 	auto first_pos = std::max(fields.begin(), fields.end() - max_elts);
 	auto end_pos = fields.end();
 	std::vector<std::string> last_fields(first_pos,end_pos);
 
-	// Code below is just to accomplish the equivalent of
-	//   sd[last_fields[0]][last_fields[1]] = LLSD::Integer(val);
-	// for an arbitrary number of fields.
+	setLLSDNested(sd, last_fields, val);
+}
+
+// setLLSDNested
+// Accomplish the equivalent of 
+//   sd[fields[0]][fields[1]]... = val;
+// for an arbitrary number of fields.
+// 
+// static
+void LLUIUsage::setLLSDNested(LLSD& sd, const std::vector<std::string>& fields, const LLSD& val)
+{
 	LLSD* fsd = &sd;
-	for (auto it=last_fields.begin(); it!=last_fields.end(); ++it)
+	for (auto it=fields.begin(); it!=fields.end(); ++it)
 	{
-		if (it == last_fields.end()-1)
+		if (it == fields.end()-1)
 		{
-			(*fsd)[*it] = LLSD::Integer(val);
+			(*fsd)[*it] = val;
 		}
 		else
 		{
@@ -116,7 +126,7 @@ LLSD LLUIUsage::asLLSD() const
 	}
 	for (auto const& it : mWidgetCounts)
 	{
-		setLLSDNested(result["widgets"], it.first, 2, it.second);
+		setLLSDPath(result["widgets"], it.first, 2, LLSD::Integer(it.second));
 	}
 	return result;
 }
diff --git a/indra/llui/lluiusage.h b/indra/llui/lluiusage.h
index df7360c210..e642c55e0f 100644
--- a/indra/llui/lluiusage.h
+++ b/indra/llui/lluiusage.h
@@ -39,7 +39,8 @@ public:
 	~LLUIUsage();
 public:
 	static std::string sanitized(const std::string& s);
-	void setLLSDNested(LLSD& sd, const std::string& path, S32 max_elts, S32 val) const;
+	static void setLLSDPath(LLSD& sd, const std::string& path, S32 max_elts, const LLSD& val);
+	static void setLLSDNested(LLSD& sd, const std::vector<std::string>& fields, const LLSD& val);
 	void logCommand(const std::string& command);
 	void logFloater(const std::string& floater);
 	void logPanel(const std::string& p);
-- 
cgit v1.2.3


From acb2e87d9425c8f671d9772409fd291d7fed9aa7 Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Thu, 11 Mar 2021 15:11:51 +0000
Subject: SL-14862 - renamed widgets to the more descriptive controls

---
 indra/llui/llbutton.cpp  |  2 +-
 indra/llui/lluictrl.cpp  |  2 +-
 indra/llui/lluiusage.cpp | 36 +++++++++++++++++++-----------------
 indra/llui/lluiusage.h   |  4 ++--
 4 files changed, 23 insertions(+), 21 deletions(-)

(limited to 'indra')

diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index 3a3d9254fd..0e59fdf519 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -442,7 +442,7 @@ BOOL LLButton::handleMouseDown(S32 x, S32 y, MASK mask)
 		{
 			LL_DEBUGS("UIUsage") << "calling mouse down function " << mFunctionName << LL_ENDL;
 			LLUIUsage::instance().logCommand(mFunctionName);
-			LLUIUsage::instance().logWidget(getPathname());
+			LLUIUsage::instance().logControl(getPathname());
 		}
 
 		/*
diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp
index 426c931d07..5924542a19 100644
--- a/indra/llui/lluictrl.cpp
+++ b/indra/llui/lluictrl.cpp
@@ -429,7 +429,7 @@ void LLUICtrl::onCommit()
 		{
 			LL_DEBUGS("UIUsage") << "calling commit function " << mFunctionName << LL_ENDL;
 			LLUIUsage::instance().logCommand(mFunctionName);
-			LLUIUsage::instance().logWidget(getPathname());
+			LLUIUsage::instance().logControl(getPathname());
 		}
 		else
 		{
diff --git a/indra/llui/lluiusage.cpp b/indra/llui/lluiusage.cpp
index 60c124b711..ccae6643b9 100644
--- a/indra/llui/lluiusage.cpp
+++ b/indra/llui/lluiusage.cpp
@@ -39,7 +39,7 @@ LLUIUsage::~LLUIUsage()
 // static
 std::string LLUIUsage::sanitized(const std::string& s)
 {
-	// ViewerStats db doesn't like "." in keys
+	// Remove characters that make the ViewerStats db unhappy
 	std::string result(s);
 	std::replace(result.begin(), result.end(), '.', '_');
 	std::replace(result.begin(), result.end(), ' ', '_');
@@ -59,10 +59,11 @@ void LLUIUsage::setLLSDPath(LLSD& sd, const std::string& path, S32 max_elts, con
 	setLLSDNested(sd, last_fields, val);
 }
 
-// setLLSDNested
+// setLLSDNested()
 // Accomplish the equivalent of 
 //   sd[fields[0]][fields[1]]... = val;
 // for an arbitrary number of fields.
+// This might be useful as an LLSD utility function; is not specific to LLUIUsage
 // 
 // static
 void LLUIUsage::setLLSDNested(LLSD& sd, const std::vector<std::string>& fields, const LLSD& val)
@@ -91,6 +92,13 @@ void LLUIUsage::logCommand(const std::string& command)
 	LL_DEBUGS("UIUsage") << "command " << command << LL_ENDL;
 }
 
+void LLUIUsage::logControl(const std::string& control)
+{
+	mControlCounts[sanitized(control)]++;
+	LL_DEBUGS("UIUsage") << "control " << control << LL_ENDL;
+}
+
+
 void LLUIUsage::logFloater(const std::string& floater)
 {
 	mFloaterCounts[sanitized(floater)]++;
@@ -103,30 +111,24 @@ void LLUIUsage::logPanel(const std::string& p)
 	LL_DEBUGS("UIUsage") << "panel " << p << LL_ENDL;
 }
 
-void LLUIUsage::logWidget(const std::string& w)
-{
-	mWidgetCounts[sanitized(w)]++;
-	LL_DEBUGS("UIUsage") << "widget " << w << LL_ENDL;
-}
-
 LLSD LLUIUsage::asLLSD() const
 {
 	LLSD result;
-	for (auto const& it : mFloaterCounts)
-	{
-		result["floaters"][it.first] = LLSD::Integer(it.second);
-	}
 	for (auto const& it : mCommandCounts)
 	{
 		result["commands"][it.first] = LLSD::Integer(it.second);
 	}
-	for (auto const& it : mPanelCounts)
+	for (auto const& it : mControlCounts)
 	{
-		result["panels"][it.first] = LLSD::Integer(it.second);
+		setLLSDPath(result["controls"], it.first, 2, LLSD::Integer(it.second));
 	}
-	for (auto const& it : mWidgetCounts)
+	for (auto const& it : mFloaterCounts)
 	{
-		setLLSDPath(result["widgets"], it.first, 2, LLSD::Integer(it.second));
+		result["floaters"][it.first] = LLSD::Integer(it.second);
+	}
+	for (auto const& it : mPanelCounts)
+	{
+		result["panels"][it.first] = LLSD::Integer(it.second);
 	}
 	return result;
 }
@@ -137,8 +139,8 @@ void LLUIUsage::clear()
 
 	LL_DEBUGS("UIUsage") << "clear" << LL_ENDL;
 	mCommandCounts.clear();
+	mControlCounts.clear();
 	mFloaterCounts.clear();
 	mPanelCounts.clear();
-	mWidgetCounts.clear();
 }
 
diff --git a/indra/llui/lluiusage.h b/indra/llui/lluiusage.h
index e642c55e0f..a30cd80db3 100644
--- a/indra/llui/lluiusage.h
+++ b/indra/llui/lluiusage.h
@@ -42,16 +42,16 @@ public:
 	static void setLLSDPath(LLSD& sd, const std::string& path, S32 max_elts, const LLSD& val);
 	static void setLLSDNested(LLSD& sd, const std::vector<std::string>& fields, const LLSD& val);
 	void logCommand(const std::string& command);
+	void logControl(const std::string& control);
 	void logFloater(const std::string& floater);
 	void logPanel(const std::string& p);
-	void logWidget(const std::string& w);
 	LLSD asLLSD() const;
 	void clear();
 private:
 	std::map<std::string,U32> mCommandCounts;
+	std::map<std::string,U32> mControlCounts;
 	std::map<std::string,U32> mFloaterCounts;
 	std::map<std::string,U32> mPanelCounts;
-	std::map<std::string,U32> mWidgetCounts;
 };
 
 #endif // LLUIUIUSAGE.h
-- 
cgit v1.2.3