From 3917de54db0dacf2aaa4f8af083db632c6a51365 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Wed, 12 May 2021 14:25:46 +0300
Subject: [PATCH] SL-15245 Multiple guide books open, but cannot close them all

Opening and closing single-instance floaters rapidly and multiple times could result in cleaning instance from floaterreg twice, thus removing new isntance instead of current one
---
 indra/llui/llfloater.cpp                      | 7 ++++++-
 indra/newview/llurlfloaterdispatchhandler.cpp | 3 +++
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index 3680e20f154..8ceb411ede7 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -510,7 +510,12 @@ void LLFloater::destroy()
 // virtual
 LLFloater::~LLFloater()
 {
-	LLFloaterReg::removeInstance(mInstanceName, mKey);
+    if (!isDead())
+    {
+        // If it's dead, instance is supposed to be already removed, and
+        // in case of single instance we can remove new one by accident
+        LLFloaterReg::removeInstance(mInstanceName, mKey);
+    }
 	
 	if( gFocusMgr.childHasKeyboardFocus(this))
 	{
diff --git a/indra/newview/llurlfloaterdispatchhandler.cpp b/indra/newview/llurlfloaterdispatchhandler.cpp
index ec2e423c64a..03434858640 100644
--- a/indra/newview/llurlfloaterdispatchhandler.cpp
+++ b/indra/newview/llurlfloaterdispatchhandler.cpp
@@ -54,6 +54,7 @@ const std::string FLOATER_GUIDEBOOK("guidebook"); // alias for how_to
 const std::string FLOATER_HOW_TO("how_to");
 const std::string FLOATER_WEB_CONTENT("web_content");
 
+// All arguments are palceholders! Server side will need to add validation first.
 // Web content universal argument
 const std::string KEY_TRUSTED_CONTENT("trusted_content");
 
@@ -105,6 +106,8 @@ bool LLUrlFloaterDispatchHandler::operator()(const LLDispatcher *, const std::st
         }
     }
 
+    // At the moment command_params is a placeholder and code treats it as map
+    // Once server side adds argument validation this will be either a map or an array
     std::string floater;
     LLSD command_params;
     std::string url;
-- 
GitLab