From c0f2f151b226417152adecb507e6b1b7f2a1f8ce Mon Sep 17 00:00:00 2001
From: Callum Prentice <callum@lindenlab.com>
Date: Fri, 12 Feb 2010 15:24:53 -0800
Subject: "Fix for EXT-4968 - Media DnD cannot navigate prims owned by other
 people" Reviewed by Rick via CodeCollab
 (http://10.1.19.90:8080/go?page=ReviewDisplay&reviewid=110)

---
 indra/newview/llviewerwindow.cpp | 81 ++++++++++++++++++++++++----------------
 1 file changed, 48 insertions(+), 33 deletions(-)

diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index b76a2e150f..1dcc7389cb 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -852,56 +852,71 @@ LLWindowCallbacks::DragNDropResult LLViewerWindow::handleDragNDrop( LLWindow *wi
 
 					LLVOVolume *obj = dynamic_cast<LLVOVolume*>(static_cast<LLViewerObject*>(pick_info.getObject()));
 				
-					if (obj && obj->permModify() && !obj->getRegion()->getCapability("ObjectMedia").empty())
+					if (obj && !obj->getRegion()->getCapability("ObjectMedia").empty())
 					{
 						LLTextureEntry *te = obj->getTE(object_face);
 						if (te)
 						{
 							if (drop)
 							{
-								if (! te->hasMedia())
+								// object does NOT have media already
+								if ( ! te->hasMedia() )
 								{
-									// Create new media entry
-									LLSD media_data;
-									// XXX Should we really do Home URL too?
-									media_data[LLMediaEntry::HOME_URL_KEY] = url;
-									media_data[LLMediaEntry::CURRENT_URL_KEY] = url;
-									media_data[LLMediaEntry::AUTO_PLAY_KEY] = true;
-									obj->syncMediaData(object_face, media_data, true, true);
-									// XXX This shouldn't be necessary, should it ?!?
-									if (obj->getMediaImpl(object_face))
-										obj->getMediaImpl(object_face)->navigateReload();
-									obj->sendMediaDataUpdate();
-								
-									result = LLWindowCallbacks::DND_COPY;
-								}
-								else {
-									// Check the whitelist
-									if (te->getMediaData()->checkCandidateUrl(url))
+									// we are allowed to modify the object
+									if ( obj->permModify() )
 									{
-										// just navigate to the URL
+										// Create new media entry
+										LLSD media_data;
+										// XXX Should we really do Home URL too?
+										media_data[LLMediaEntry::HOME_URL_KEY] = url;
+										media_data[LLMediaEntry::CURRENT_URL_KEY] = url;
+										media_data[LLMediaEntry::AUTO_PLAY_KEY] = true;
+										obj->syncMediaData(object_face, media_data, true, true);
+										// XXX This shouldn't be necessary, should it ?!?
 										if (obj->getMediaImpl(object_face))
+											obj->getMediaImpl(object_face)->navigateReload();
+										obj->sendMediaDataUpdate();
+
+										result = LLWindowCallbacks::DND_COPY;
+									}
+								}
+								else 
+								// object HAS media already
+								{
+									// URL passes the whitelist
+									if (te->getMediaData()->checkCandidateUrl( url ) )
+									{
+										// we are allowed to modify the object or we have navigate permissions
+										// NOTE: Design states you you can change the URL if you have media 
+										//       navigate permissions even if you do not have prim modify rights
+										if ( obj->permModify() || obj->hasMediaPermission( te->getMediaData(), LLVOVolume::MEDIA_PERM_INTERACT ) )
 										{
-											obj->getMediaImpl(object_face)->navigateTo(url);
+											// just navigate to the URL
+											if (obj->getMediaImpl(object_face))
+											{
+												obj->getMediaImpl(object_face)->navigateTo(url);
+											}
+											else 
+											{
+												// This is very strange.  Navigation should
+												// happen via the Impl, but we don't have one.
+												// This sends it to the server, which /should/
+												// trigger us getting it.  Hopefully.
+												LLSD media_data;
+												media_data[LLMediaEntry::CURRENT_URL_KEY] = url;
+												obj->syncMediaData(object_face, media_data, true, true);
+												obj->sendMediaDataUpdate();
+											}
+											result = LLWindowCallbacks::DND_LINK;
 										}
-										else {
-											// This is very strange.  Navigation should
-											// happen via the Impl, but we don't have one.
-											// This sends it to the server, which /should/
-											// trigger us getting it.  Hopefully.
-											LLSD media_data;
-											media_data[LLMediaEntry::CURRENT_URL_KEY] = url;
-											obj->syncMediaData(object_face, media_data, true, true);
-											obj->sendMediaDataUpdate();
-										}
-										result = LLWindowCallbacks::DND_LINK;
 									}
 								}
 								LLSelectMgr::getInstance()->unhighlightObjectOnly(mDragHoveredObject);
 								mDragHoveredObject = NULL;
 							
 							}
-							else {
+							else 
+							{
 								// Check the whitelist, if there's media (otherwise just show it)
 								if (te->getMediaData() == NULL || te->getMediaData()->checkCandidateUrl(url))
 								{
-- 
cgit v1.2.3