From bc3f2d53d10c64ccded6aaa14ea37eac78ef6856 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Tue, 18 Jul 2023 01:56:42 +0300
Subject: [PATCH] SL-19891 Make sure focusable elements clear focus on
 destruction

---
 indra/llcharacter/llkeyframemotion.cpp | 21 ++++++++++++++-------
 indra/llui/lldraghandle.cpp            |  1 +
 indra/llui/llfolderviewitem.cpp        |  1 +
 indra/llui/lllayoutstack.cpp           |  2 ++
 indra/llui/llresizehandle.cpp          |  5 +++++
 indra/llui/llresizehandle.h            |  1 +
 indra/newview/llviewermediafocus.cpp   |  1 +
 7 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/indra/llcharacter/llkeyframemotion.cpp b/indra/llcharacter/llkeyframemotion.cpp
index 3cef382bbf0..d95ec159f2b 100644
--- a/indra/llcharacter/llkeyframemotion.cpp
+++ b/indra/llcharacter/llkeyframemotion.cpp
@@ -497,13 +497,20 @@ LLMotion::LLMotionInitStatus LLKeyframeMotion::onInitialize(LLCharacter *charact
 		// request asset
 		mAssetStatus = ASSET_FETCHED;
 
-        LL_DEBUGS("Animation") << "Requesting data fetch for: " << mID << LL_ENDL;
-		character_id = new LLUUID(mCharacter->getID());
-		gAssetStorage->getAssetData(mID,
-						LLAssetType::AT_ANIMATION,
-						onLoadComplete,
-						(void *)character_id,
-						FALSE);
+        if (mID.notNull())
+        {
+            LL_DEBUGS("Animation") << "Requesting data fetch for: " << mID << LL_ENDL;
+            character_id = new LLUUID(mCharacter->getID());
+            gAssetStorage->getAssetData(mID,
+                                        LLAssetType::AT_ANIMATION,
+                                        onLoadComplete,
+                                        (void*)character_id,
+                                        FALSE);
+        }
+        else
+        {
+            LL_INFOS("Animation") << "Attempted to fetch animation " << mName << " with null id for character " << mCharacter->getID() << LL_ENDL;
+        }
 
 		return STATUS_HOLD;
 	case ASSET_FETCHED:
diff --git a/indra/llui/lldraghandle.cpp b/indra/llui/lldraghandle.cpp
index 48bf5bb80ff..220f5ee825e 100644
--- a/indra/llui/lldraghandle.cpp
+++ b/indra/llui/lldraghandle.cpp
@@ -68,6 +68,7 @@ LLDragHandle::LLDragHandle(const LLDragHandle::Params& p)
 
 LLDragHandle::~LLDragHandle()
 {
+    gFocusMgr.removeKeyboardFocusWithoutCallback(this);
 	removeChild(mTitleBox);
 	delete mTitleBox;
 }
diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp
index e2b5279aab6..5319af1b602 100644
--- a/indra/llui/llfolderviewitem.cpp
+++ b/indra/llui/llfolderviewitem.cpp
@@ -177,6 +177,7 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)
 LLFolderViewItem::~LLFolderViewItem()
 {
 	mViewModelItem = NULL;
+    gFocusMgr.removeKeyboardFocusWithoutCallback(this);
 }
 
 BOOL LLFolderViewItem::postBuild()
diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp
index ae9dba5945f..7b22f9dbdc2 100644
--- a/indra/llui/lllayoutstack.cpp
+++ b/indra/llui/lllayoutstack.cpp
@@ -89,6 +89,8 @@ LLLayoutPanel::~LLLayoutPanel()
 	// probably not necessary, but...
 	delete mResizeBar;
 	mResizeBar = NULL;
+
+    gFocusMgr.removeKeyboardFocusWithoutCallback(this);
 }
 
 F32 LLLayoutPanel::getAutoResizeFactor() const
diff --git a/indra/llui/llresizehandle.cpp b/indra/llui/llresizehandle.cpp
index 24794305ac0..13ef0fdb7f7 100644
--- a/indra/llui/llresizehandle.cpp
+++ b/indra/llui/llresizehandle.cpp
@@ -70,6 +70,11 @@ LLResizeHandle::LLResizeHandle(const LLResizeHandle::Params& p)
 	}
 }
 
+LLResizeHandle::~LLResizeHandle()
+{
+    gFocusMgr.removeKeyboardFocusWithoutCallback(this);
+}
+
 
 BOOL LLResizeHandle::handleMouseDown(S32 x, S32 y, MASK mask)
 {
diff --git a/indra/llui/llresizehandle.h b/indra/llui/llresizehandle.h
index 7541b9e6c06..ae20ecaa774 100644
--- a/indra/llui/llresizehandle.h
+++ b/indra/llui/llresizehandle.h
@@ -45,6 +45,7 @@ class LLResizeHandle : public LLView
 		Params();
 	};
 
+    ~LLResizeHandle();
 protected:
 	LLResizeHandle(const LLResizeHandle::Params&);
 	friend class LLUICtrlFactory;
diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp
index ba80eeb6b63..e914e2121c8 100644
--- a/indra/newview/llviewermediafocus.cpp
+++ b/indra/newview/llviewermediafocus.cpp
@@ -63,6 +63,7 @@ LLViewerMediaFocus::~LLViewerMediaFocus()
 {
 	// The destructor for LLSingletons happens at atexit() time, which is too late to do much.
 	// Clean up in cleanupClass() instead.
+    gFocusMgr.removeKeyboardFocusWithoutCallback(this);
 }
 
 void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 face, viewer_media_t media_impl, LLVector3 pick_normal)
-- 
GitLab