From e92e72ff3a2c0d0d95cb866f9567a2146bc8dbfa Mon Sep 17 00:00:00 2001
From: pavelk_productengine <none@none>
Date: Fri, 24 Apr 2015 23:24:44 +0300
Subject: [PATCH] MAINT-5106 FIXED [MAC] if SL viewer is not running, clicking
 on SLURL launches viewer, BUT start location is not set

---
 indra/llwindow/llwindowmacosx-objc.h |  1 +
 indra/newview/llappviewermacosx.cpp  | 50 ++++++++++++++++++----------
 2 files changed, 33 insertions(+), 18 deletions(-)

diff --git a/indra/llwindow/llwindowmacosx-objc.h b/indra/llwindow/llwindowmacosx-objc.h
index f02052ca6ad..e6e8f27f534 100755
--- a/indra/llwindow/llwindowmacosx-objc.h
+++ b/indra/llwindow/llwindowmacosx-objc.h
@@ -53,6 +53,7 @@ bool runMainLoop();
 void initMainLoop();
 void cleanupViewer();
 void handleUrl(const char* url);
+void dispatchUrl(std::string url);
 
 /* Defined in llwindowmacosx-objc.mm: */
 int createNSApp(int argc, const char **argv);
diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp
index 56154a2de38..09227806fdf 100755
--- a/indra/newview/llappviewermacosx.cpp
+++ b/indra/newview/llappviewermacosx.cpp
@@ -62,9 +62,10 @@ namespace
 	// They are not used immediately by the app.
 	int gArgC;
 	char** gArgV;
-	LLAppViewerMacOSX* gViewerAppPtr;
+	LLAppViewerMacOSX* gViewerAppPtr = NULL;
 
     void (*gOldTerminateHandler)() = NULL;
+    std::string gHandleSLURL;
 }
 
 static void exceptionTerminateHandler()
@@ -107,7 +108,11 @@ bool initViewer()
 	{
 		LL_WARNS() << "Application init failed." << LL_ENDL;
 	}
-
+    else if (!gHandleSLURL.empty())
+    {
+        dispatchUrl(gHandleSLURL);
+        gHandleSLURL = "";
+    }
 	return ok;
 }
 
@@ -393,22 +398,31 @@ bool LLAppViewerMacOSX::getMasterSystemAudioMute()
 
 void handleUrl(const char* url_utf8)
 {
-    if (url_utf8)
+    if (url_utf8 && gViewerAppPtr)
     {
-        std::string url = url_utf8;
-	    // Safari 3.2 silently mangles secondlife:///app/ URLs into
-	    // secondlife:/app/ (only one leading slash).
-	    // Fix them up to meet the URL specification. JC
-	    const std::string prefix = "secondlife:/app/";
-	    std::string test_prefix = url.substr(0, prefix.length());
-	    LLStringUtil::toLower(test_prefix);
-	    if (test_prefix == prefix)
-	    {
-		    url.replace(0, prefix.length(), "secondlife:///app/");
-	    }
-		
-	    LLMediaCtrl* web = NULL;
-    	const bool trusted_browser = false;
-	    LLURLDispatcher::dispatch(url, "", web, trusted_browser);
+        gHandleSLURL = "";
+        dispatchUrl(url_utf8);
     }
+    else if (url_utf8)
+    {
+        gHandleSLURL = url_utf8;
+    }
+}
+
+void dispatchUrl(std::string url)
+{
+    // Safari 3.2 silently mangles secondlife:///app/ URLs into
+    // secondlife:/app/ (only one leading slash).
+    // Fix them up to meet the URL specification. JC
+    const std::string prefix = "secondlife:/app/";
+    std::string test_prefix = url.substr(0, prefix.length());
+    LLStringUtil::toLower(test_prefix);
+    if (test_prefix == prefix)
+    {
+        url.replace(0, prefix.length(), "secondlife:///app/");
+    }
+    
+    LLMediaCtrl* web = NULL;
+    const bool trusted_browser = false;
+    LLURLDispatcher::dispatch(url, "", web, trusted_browser);
 }
-- 
GitLab