Merge branch 'DRTVWR-570-maint-Q' of https://bitbucket.org/lindenlab/viewer
commit
2b65ae8215
|
|
@ -2708,9 +2708,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>6bb03fe0b9dd44d3850ae9cae2161d76</string>
|
||||
<string>8114c6a7e499ea20d325db0de08ce30a</string>
|
||||
<key>url</key>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/105416/922669/openjpeg-2.5.0.575468-darwin64-575468.tar.bz2</string>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/105469/923024/openjpeg-2.5.0.575496-darwin64-575496.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>darwin64</string>
|
||||
|
|
@ -2732,9 +2732,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>a01d66d72d7c865364cd5761e56e8735</string>
|
||||
<string>edc9388870d951632a6d595792293e05</string>
|
||||
<key>url</key>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/105418/922681/openjpeg-2.5.0.575468-windows-575468.tar.bz2</string>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/105472/923036/openjpeg-2.5.0.575496-windows-575496.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows</string>
|
||||
|
|
@ -2744,16 +2744,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>8bd727bc7d6e0e6223e9ea49c14dd511</string>
|
||||
<string>b95f0732f2388ebb0ddf33d4a30e0ff1</string>
|
||||
<key>url</key>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/105419/922682/openjpeg-2.5.0.575468-windows64-575468.tar.bz2</string>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/105471/923037/openjpeg-2.5.0.575496-windows64-575496.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows64</string>
|
||||
</map>
|
||||
</map>
|
||||
<key>version</key>
|
||||
<string>2.5.0.575468</string>
|
||||
<string>2.5.0.575496</string>
|
||||
</map>
|
||||
<key>openssl</key>
|
||||
<map>
|
||||
|
|
|
|||
|
|
@ -1655,6 +1655,7 @@ Zi Ree
|
|||
VWR-25588
|
||||
STORM-1790
|
||||
STORM-1842
|
||||
SL-18348
|
||||
Zipherius Turas
|
||||
VWR-76
|
||||
VWR-77
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
# also defined, but not for general use are
|
||||
# OPENJPEG_LIBRARY, where to find the OpenJPEG library.
|
||||
|
||||
FIND_PATH(OPENJPEG_INCLUDE_DIR openjp2.h
|
||||
FIND_PATH(OPENJPEG_INCLUDE_DIR openjpeg.h
|
||||
/usr/local/include/openjpeg-2.1
|
||||
/usr/local/include/openjpeg
|
||||
/usr/local/include
|
||||
|
|
|
|||
|
|
@ -287,25 +287,15 @@ std::string LLCoros::launch(const std::string& prefix, const callable_t& callabl
|
|||
return name;
|
||||
}
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
#if LL_WINDOWS
|
||||
|
||||
static const U32 STATUS_MSC_EXCEPTION = 0xE06D7363; // compiler specific
|
||||
|
||||
U32 cpp_exception_filter(U32 code, struct _EXCEPTION_POINTERS *exception_infop, const std::string& name)
|
||||
U32 exception_filter(U32 code, struct _EXCEPTION_POINTERS *exception_infop)
|
||||
{
|
||||
// C++ exceptions were logged in toplevelTryWrapper, but not SEH
|
||||
// log SEH exceptions here, to make sure it gets into bugsplat's
|
||||
// report and because __try won't allow std::string operations
|
||||
if (code != STATUS_MSC_EXCEPTION)
|
||||
{
|
||||
LL_WARNS() << "SEH crash in " << name << ", code: " << code << LL_ENDL;
|
||||
}
|
||||
// Handle bugsplat here, since GetExceptionInformation() can only be
|
||||
// called from within filter for __except(filter), not from __except's {}
|
||||
// Bugsplat should get all exceptions, C++ and SEH
|
||||
LLApp::instance()->reportCrashToBugsplat(exception_infop);
|
||||
|
||||
// Only convert non C++ exceptions.
|
||||
if (code == STATUS_MSC_EXCEPTION)
|
||||
{
|
||||
// C++ exception, go on
|
||||
|
|
@ -318,28 +308,38 @@ U32 cpp_exception_filter(U32 code, struct _EXCEPTION_POINTERS *exception_infop,
|
|||
}
|
||||
}
|
||||
|
||||
void LLCoros::sehHandle(const std::string& name, const LLCoros::callable_t& callable)
|
||||
void sehandle(const LLCoros::callable_t& callable)
|
||||
{
|
||||
__try
|
||||
{
|
||||
LLCoros::toplevelTryWrapper(name, callable);
|
||||
callable();
|
||||
}
|
||||
__except (cpp_exception_filter(GetExceptionCode(), GetExceptionInformation(), name))
|
||||
__except (exception_filter(GetExceptionCode(), GetExceptionInformation()))
|
||||
{
|
||||
// convert to C++ styled exception for handlers other than bugsplat
|
||||
// convert to C++ styled exception
|
||||
// Note: it might be better to use _se_set_translator
|
||||
// if you want exception to inherit full callstack
|
||||
//
|
||||
// in case of bugsplat this will get to exceptionTerminateHandler and
|
||||
// looks like fiber will terminate application after that
|
||||
char integer_string[512];
|
||||
sprintf(integer_string, "SEH crash in %s, code: %lu\n", name.c_str(), GetExceptionCode());
|
||||
sprintf(integer_string, "SEH, code: %lu\n", GetExceptionCode());
|
||||
throw std::exception(integer_string);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void LLCoros::toplevelTryWrapper(const std::string& name, const callable_t& callable)
|
||||
#else // ! LL_WINDOWS
|
||||
|
||||
inline void sehandle(const LLCoros::callable_t& callable)
|
||||
{
|
||||
callable();
|
||||
}
|
||||
|
||||
#endif // ! LL_WINDOWS
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
// Top-level wrapper around caller's coroutine callable.
|
||||
// Normally we like to pass strings and such by const reference -- but in this
|
||||
// case, we WANT to copy both the name and the callable to our local stack!
|
||||
void LLCoros::toplevel(std::string name, callable_t callable)
|
||||
{
|
||||
// keep the CoroData on this top-level function's stack frame
|
||||
CoroData corodata(name);
|
||||
|
|
@ -349,7 +349,7 @@ void LLCoros::toplevelTryWrapper(const std::string& name, const callable_t& call
|
|||
// run the code the caller actually wants in the coroutine
|
||||
try
|
||||
{
|
||||
callable();
|
||||
sehandle(callable);
|
||||
}
|
||||
catch (const Stop& exc)
|
||||
{
|
||||
|
|
@ -365,36 +365,14 @@ void LLCoros::toplevelTryWrapper(const std::string& name, const callable_t& call
|
|||
}
|
||||
catch (...)
|
||||
{
|
||||
#if LL_WINDOWS
|
||||
// Any OTHER kind of uncaught exception will cause the viewer to
|
||||
// crash, SEH handling should catch it and report to bugsplat.
|
||||
LOG_UNHANDLED_EXCEPTION(STRINGIZE("coroutine " << name));
|
||||
// to not modify callstack
|
||||
throw;
|
||||
#else
|
||||
// Stash any OTHER kind of uncaught exception in the rethrow() queue
|
||||
// to be rethrown by the main fiber.
|
||||
LL_WARNS("LLCoros") << "Capturing uncaught exception in coroutine "
|
||||
<< name << LL_ENDL;
|
||||
LLCoros::instance().saveException(name, std::current_exception());
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
// Top-level wrapper around caller's coroutine callable.
|
||||
// Normally we like to pass strings and such by const reference -- but in this
|
||||
// case, we WANT to copy both the name and the callable to our local stack!
|
||||
void LLCoros::toplevel(std::string name, callable_t callable)
|
||||
{
|
||||
#if LL_WINDOWS
|
||||
// Because SEH can's have unwinding, need to call a wrapper
|
||||
// 'try' is inside SEH handling to not catch LLContinue
|
||||
sehHandle(name, callable);
|
||||
#else
|
||||
toplevelTryWrapper(name, callable);
|
||||
#endif
|
||||
}
|
||||
|
||||
//static
|
||||
void LLCoros::checkStop()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -307,11 +307,7 @@ public:
|
|||
|
||||
private:
|
||||
std::string generateDistinctName(const std::string& prefix) const;
|
||||
void toplevelTryWrapper(const std::string& name, const callable_t& callable);
|
||||
#if LL_WINDOWS
|
||||
void sehHandle(const std::string& name, const callable_t& callable); // calls toplevelTryWrapper
|
||||
#endif
|
||||
void toplevel(std::string name, callable_t callable); // calls sehHandle or toplevelTryWrapper
|
||||
void toplevel(std::string name, callable_t callable);
|
||||
struct CoroData;
|
||||
static CoroData& get_CoroData(const std::string& caller);
|
||||
void saveException(const std::string& name, std::exception_ptr exc);
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ class LLBuyCurrencyHTMLHandler :
|
|||
{
|
||||
public:
|
||||
// requests will be throttled from a non-trusted browser
|
||||
LLBuyCurrencyHTMLHandler() : LLCommandHandler( "buycurrencyhtml", UNTRUSTED_ALLOW ) {}
|
||||
LLBuyCurrencyHTMLHandler() : LLCommandHandler( "buycurrencyhtml", UNTRUSTED_THROTTLE) {}
|
||||
|
||||
bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@
|
|||
#define THROTTLE_PERIOD 5 // required seconds between throttled commands
|
||||
|
||||
static LLCommandDispatcherListener sCommandDispatcherListener;
|
||||
const std::string LLCommandHandler::NAV_TYPE_CLICKED = "clicked";
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Underlying registry for command handlers, not directly accessible.
|
||||
|
|
@ -64,6 +65,9 @@ public:
|
|||
bool trusted_browser);
|
||||
|
||||
private:
|
||||
void notifySlurlBlocked();
|
||||
void notifySlurlThrottled();
|
||||
|
||||
friend LLSD LLCommandDispatcher::enumerate();
|
||||
std::map<std::string, LLCommandHandlerInfo> mMap;
|
||||
};
|
||||
|
|
@ -96,8 +100,6 @@ bool LLCommandHandlerRegistry::dispatch(const std::string& cmd,
|
|||
const std::string& nav_type,
|
||||
bool trusted_browser)
|
||||
{
|
||||
static bool slurl_blocked = false;
|
||||
static bool slurl_throttled = false;
|
||||
static F64 last_throttle_time = 0.0;
|
||||
F64 cur_time = 0.0;
|
||||
std::map<std::string, LLCommandHandlerInfo>::iterator it = mMap.find(cmd);
|
||||
|
|
@ -115,6 +117,58 @@ bool LLCommandHandlerRegistry::dispatch(const std::string& cmd,
|
|||
// block request from external browser, but report as
|
||||
// "handled" because it was well formatted.
|
||||
LL_WARNS_ONCE("SLURL") << "Blocked SLURL command from untrusted browser" << LL_ENDL;
|
||||
notifySlurlBlocked();
|
||||
return true;
|
||||
|
||||
case LLCommandHandler::UNTRUSTED_CLICK_ONLY:
|
||||
if (nav_type == LLCommandHandler::NAV_TYPE_CLICKED
|
||||
&& info.mHandler->canHandleUntrusted(params, query_map, web, nav_type))
|
||||
{
|
||||
break;
|
||||
}
|
||||
LL_WARNS_ONCE("SLURL") << "Blocked SLURL click-only command " << cmd << " from untrusted browser" << LL_ENDL;
|
||||
notifySlurlBlocked();
|
||||
return true;
|
||||
|
||||
case LLCommandHandler::UNTRUSTED_THROTTLE:
|
||||
//skip initial request from external browser before STATE_BROWSER_INIT
|
||||
if (LLStartUp::getStartupState() == STATE_FIRST)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (!info.mHandler->canHandleUntrusted(params, query_map, web, nav_type))
|
||||
{
|
||||
LL_WARNS_ONCE("SLURL") << "Blocked SLURL command from untrusted browser" << LL_ENDL;
|
||||
notifySlurlBlocked();
|
||||
return true;
|
||||
}
|
||||
// if users actually click on a link, we don't need to throttle it
|
||||
// (throttling mechanism is used to prevent an avalanche of clicks via
|
||||
// javascript
|
||||
if (nav_type == LLCommandHandler::NAV_TYPE_CLICKED)
|
||||
{
|
||||
break;
|
||||
}
|
||||
cur_time = LLTimer::getElapsedSeconds();
|
||||
if (cur_time < last_throttle_time + THROTTLE_PERIOD)
|
||||
{
|
||||
// block request from external browser if it happened
|
||||
// within THROTTLE_PERIOD seconds of the last command
|
||||
LL_WARNS_ONCE("SLURL") << "Throttled SLURL command from untrusted browser" << LL_ENDL;
|
||||
notifySlurlThrottled();
|
||||
return true;
|
||||
}
|
||||
last_throttle_time = cur_time;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!info.mHandler) return false;
|
||||
return info.mHandler->handle(params, query_map, web);
|
||||
}
|
||||
|
||||
void LLCommandHandlerRegistry::notifySlurlBlocked()
|
||||
{
|
||||
static bool slurl_blocked = false;
|
||||
if (!slurl_blocked)
|
||||
{
|
||||
if (LLStartUp::getStartupState() >= STATE_BROWSER_INIT)
|
||||
|
|
@ -124,43 +178,20 @@ bool LLCommandHandlerRegistry::dispatch(const std::string& cmd,
|
|||
}
|
||||
slurl_blocked = true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
case LLCommandHandler::UNTRUSTED_THROTTLE:
|
||||
// if users actually click on a link, we don't need to throttle it
|
||||
// (throttling mechanism is used to prevent an avalanche of clicks via
|
||||
// javascript
|
||||
if ( nav_type == "clicked" )
|
||||
void LLCommandHandlerRegistry::notifySlurlThrottled()
|
||||
{
|
||||
break;
|
||||
}
|
||||
//skip initial request from external browser before STATE_BROWSER_INIT
|
||||
if (LLStartUp::getStartupState() == STATE_FIRST)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
cur_time = LLTimer::getElapsedSeconds();
|
||||
if (cur_time < last_throttle_time + THROTTLE_PERIOD)
|
||||
{
|
||||
// block request from external browser if it happened
|
||||
// within THROTTLE_PERIOD seconds of the last command
|
||||
LL_WARNS_ONCE("SLURL") << "Throttled SLURL command from untrusted browser" << LL_ENDL;
|
||||
static bool slurl_throttled = false;
|
||||
if (!slurl_throttled)
|
||||
{
|
||||
if (LLStartUp::getStartupState() >= STATE_BROWSER_INIT)
|
||||
{
|
||||
// Note: commands can arrive before we initialize everything we need for Notification.
|
||||
LLNotificationsUtil::add("ThrottledSLURL");
|
||||
}
|
||||
slurl_throttled = true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
last_throttle_time = cur_time;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!info.mHandler) return false;
|
||||
return info.mHandler->handle(params, query_map, web);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
|
|
@ -230,6 +261,7 @@ symbol_info symbols[] =
|
|||
{
|
||||
ent(LLCommandHandler::UNTRUSTED_ALLOW), // allow commands from untrusted browsers
|
||||
ent(LLCommandHandler::UNTRUSTED_BLOCK), // ignore commands from untrusted browsers
|
||||
ent(LLCommandHandler::UNTRUSTED_CLICK_ONLY), // allow untrusted, but only if clicked
|
||||
ent(LLCommandHandler::UNTRUSTED_THROTTLE) // allow untrusted, but only a few per min.
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -65,9 +65,12 @@ public:
|
|||
{
|
||||
UNTRUSTED_ALLOW, // allow commands from untrusted browsers
|
||||
UNTRUSTED_BLOCK, // ignore commands from untrusted browsers
|
||||
UNTRUSTED_CLICK_ONLY, // allow untrusted, but only if clicked
|
||||
UNTRUSTED_THROTTLE // allow untrusted, but only a few per min.
|
||||
};
|
||||
|
||||
static const std::string NAV_TYPE_CLICKED;
|
||||
|
||||
LLCommandHandler(const char* command, EUntrustedAccess untrusted_access);
|
||||
// Automatically registers object to get called when
|
||||
// command is executed. All commands can be processed
|
||||
|
|
@ -76,6 +79,13 @@ public:
|
|||
|
||||
virtual ~LLCommandHandler();
|
||||
|
||||
virtual bool canHandleUntrusted(
|
||||
const LLSD& params,
|
||||
const LLSD& query_map,
|
||||
LLMediaCtrl* web,
|
||||
const std::string& nav_type)
|
||||
{ return true; }
|
||||
|
||||
virtual bool handle(const LLSD& params,
|
||||
const LLSD& query_map,
|
||||
LLMediaCtrl* web) = 0;
|
||||
|
|
|
|||
|
|
@ -84,7 +84,7 @@ LLFloater360Capture::~LLFloater360Capture()
|
|||
// Tell the Simulator not to send us everything anymore
|
||||
// and revert to the regular "keyhole" frustum of interest
|
||||
// list updates.
|
||||
if (gSavedSettings.getBOOL("360CaptureUseInterestListCap"))
|
||||
if (gSavedSettings.getBOOL("360CaptureUseInterestListCap") && !LLApp::isExiting())
|
||||
{
|
||||
const bool send_everything = false;
|
||||
changeInterestListMode(send_everything);
|
||||
|
|
@ -553,7 +553,8 @@ void LLFloater360Capture::capture360Images()
|
|||
// We need to convert from the angle getYaw() gives us into something
|
||||
// the XMP data field wants (N=0, E=90, S=180, W= 270 etc.)
|
||||
mInitialHeadingDeg = (360 + 90 - (int)(camera->getYaw() * RAD_TO_DEG)) % 360;
|
||||
LL_INFOS("360Capture") << "Recording a heading of " << (int)(mInitialHeadingDeg) << LL_ENDL;
|
||||
LL_INFOS("360Capture") << "Recording a heading of " << (int)(mInitialHeadingDeg)
|
||||
<< " Image size: " << (S32)mSourceImageSize << LL_ENDL;
|
||||
|
||||
// camera constants for the square, cube map capture image
|
||||
camera->setAspect(1.0); // must set aspect ratio first to avoid undesirable clamping of vertical FoV
|
||||
|
|
@ -603,6 +604,9 @@ void LLFloater360Capture::capture360Images()
|
|||
// for each of the 6 directions we shoot...
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
LLAppViewer::instance()->pauseMainloopTimeout();
|
||||
LLViewerStats::instance().getRecording().stop();
|
||||
|
||||
// these buffers are where the raw, captured pixels are stored and
|
||||
// the first time we use them, we have to make a new one
|
||||
if (mRawImages[i] == nullptr)
|
||||
|
|
@ -640,8 +644,10 @@ void LLFloater360Capture::capture360Images()
|
|||
auto duration = std::chrono::duration_cast<std::chrono::duration<double>>(t_end - t_start);
|
||||
encode_time_total += duration.count();
|
||||
|
||||
// ping the main loop in case the snapshot process takes a really long
|
||||
// time and we get disconnected
|
||||
LLViewerStats::instance().getRecording().resume();
|
||||
LLAppViewer::instance()->resumeMainloopTimeout();
|
||||
|
||||
// update main loop timeout state
|
||||
LLAppViewer::instance()->pingMainloopTimeout("LLFloater360Capture::capture360Images");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@
|
|||
#include "llpathfindinglinkset.h"
|
||||
#include "llpathfindinglinksetlist.h"
|
||||
#include "llpathfindingmanager.h"
|
||||
#include "llsearcheditor.h"
|
||||
#include "llscrolllistitem.h"
|
||||
#include "llsd.h"
|
||||
#include "lltextbase.h"
|
||||
|
|
@ -114,16 +115,12 @@ BOOL LLFloaterPathfindingLinksets::postBuild()
|
|||
{
|
||||
mBeaconColor = LLUIColorTable::getInstance()->getColor("PathfindingLinksetBeaconColor");
|
||||
|
||||
mFilterByName = findChild<LLLineEditor>("filter_by_name");
|
||||
llassert(mFilterByName != NULL);
|
||||
mFilterByName = getChild<LLSearchEditor>("filter_by_name");
|
||||
mFilterByName->setCommitCallback(boost::bind(&LLFloaterPathfindingLinksets::onApplyAllFilters, this));
|
||||
mFilterByName->setSelectAllonFocusReceived(true);
|
||||
mFilterByName->setCommitOnFocusLost(true);
|
||||
|
||||
mFilterByDescription = findChild<LLLineEditor>("filter_by_description");
|
||||
llassert(mFilterByDescription != NULL);
|
||||
mFilterByDescription = getChild<LLSearchEditor>("filter_by_description");
|
||||
mFilterByDescription->setCommitCallback(boost::bind(&LLFloaterPathfindingLinksets::onApplyAllFilters, this));
|
||||
mFilterByDescription->setSelectAllonFocusReceived(true);
|
||||
mFilterByDescription->setCommitOnFocusLost(true);
|
||||
|
||||
mFilterByLinksetUse = findChild<LLComboBox>("filter_by_linkset_use");
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@ class LLSD;
|
|||
class LLTextBase;
|
||||
class LLUICtrl;
|
||||
class LLVector3;
|
||||
class LLSearchEditor;
|
||||
|
||||
class LLFloaterPathfindingLinksets : public LLFloaterPathfindingObjects
|
||||
{
|
||||
|
|
@ -105,8 +106,8 @@ private:
|
|||
LLPathfindingLinkset::ELinksetUse convertToLinksetUse(LLSD pXuiValue) const;
|
||||
LLSD convertToXuiValue(LLPathfindingLinkset::ELinksetUse pLinksetUse) const;
|
||||
|
||||
LLLineEditor *mFilterByName;
|
||||
LLLineEditor *mFilterByDescription;
|
||||
LLSearchEditor *mFilterByName;
|
||||
LLSearchEditor *mFilterByDescription;
|
||||
LLComboBox *mFilterByLinksetUse;
|
||||
LLComboBox *mEditLinksetUse;
|
||||
LLScrollListItem *mEditLinksetUseUnset;
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ class LLSearchHandler : public LLCommandHandler
|
|||
{
|
||||
public:
|
||||
// requires trusted browser to trigger
|
||||
LLSearchHandler() : LLCommandHandler("search", UNTRUSTED_THROTTLE) { }
|
||||
LLSearchHandler() : LLCommandHandler("search", UNTRUSTED_CLICK_ONLY) { }
|
||||
bool handle(const LLSD& tokens, const LLSD& query_map, LLMediaCtrl* web)
|
||||
{
|
||||
if (!LLUI::getInstance()->mSettingGroups["config"]->getBOOL("EnableSearch"))
|
||||
|
|
|
|||
|
|
@ -131,7 +131,7 @@ class LLWorldMapHandler : public LLCommandHandler
|
|||
{
|
||||
public:
|
||||
// requires trusted browser to trigger
|
||||
LLWorldMapHandler() : LLCommandHandler("worldmap", UNTRUSTED_THROTTLE ) { }
|
||||
LLWorldMapHandler() : LLCommandHandler("worldmap", UNTRUSTED_CLICK_ONLY ) { }
|
||||
|
||||
bool handle(const LLSD& params, const LLSD& query_map,
|
||||
LLMediaCtrl* web)
|
||||
|
|
@ -175,7 +175,7 @@ class LLMapTrackAvatarHandler : public LLCommandHandler
|
|||
{
|
||||
public:
|
||||
// requires trusted browser to trigger
|
||||
LLMapTrackAvatarHandler() : LLCommandHandler("maptrackavatar", UNTRUSTED_THROTTLE)
|
||||
LLMapTrackAvatarHandler() : LLCommandHandler("maptrackavatar", UNTRUSTED_CLICK_ONLY)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -68,7 +68,32 @@ class LLGroupHandler : public LLCommandHandler
|
|||
{
|
||||
public:
|
||||
// requires trusted browser to trigger
|
||||
LLGroupHandler() : LLCommandHandler("group", UNTRUSTED_THROTTLE) { }
|
||||
LLGroupHandler() : LLCommandHandler("group", UNTRUSTED_CLICK_ONLY) { }
|
||||
|
||||
virtual bool canHandleUntrusted(
|
||||
const LLSD& params,
|
||||
const LLSD& query_map,
|
||||
LLMediaCtrl* web,
|
||||
const std::string& nav_type)
|
||||
{
|
||||
if (params.size() < 1)
|
||||
{
|
||||
return true; // don't block, will fail later
|
||||
}
|
||||
|
||||
if (nav_type == NAV_TYPE_CLICKED)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
const std::string verb = params[0].asString();
|
||||
if (verb == "create")
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool handle(const LLSD& tokens, const LLSD& query_map,
|
||||
LLMediaCtrl* web)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -2718,37 +2718,16 @@ void LLModelPreview::genMeshOptimizerLODs(S32 which_lod, S32 meshopt_mode, U32 d
|
|||
if (sloppy_ratio < 0)
|
||||
{
|
||||
// Sloppy method didn't work, try with smaller decimation values
|
||||
S32 size_vertices = 0;
|
||||
|
||||
for (U32 face_idx = 0; face_idx < base->getNumVolumeFaces(); ++face_idx)
|
||||
{
|
||||
const LLVolumeFace &face = base->getVolumeFace(face_idx);
|
||||
size_vertices += face.mNumVertices;
|
||||
}
|
||||
|
||||
// Complex models aren't supposed to get here, they are supposed
|
||||
// to work on a first try of sloppy due to having more viggle room.
|
||||
// If they didn't, something is likely wrong, no point locking the
|
||||
// thread in a long calculation that will fail.
|
||||
const U32 too_many_vertices = 27000;
|
||||
if (size_vertices > too_many_vertices)
|
||||
{
|
||||
// <FS:Beq> log this properly.
|
||||
// LL_WARNS() << "Sloppy optimization method failed for a complex model " << target_model->getName() << LL_ENDL;
|
||||
out << "Sloppy optimization method failed for a complex model " << target_model->getName();
|
||||
LL_WARNS() << out.str() << LL_ENDL;
|
||||
LLFloaterModelPreview::addStringToLog(out, true);
|
||||
// </FS:Beq>
|
||||
}
|
||||
else
|
||||
{
|
||||
// Find a decimator that does work
|
||||
F32 sloppy_decimation_step = sqrt((F32)decimation); // example: 27->15->9->5->3
|
||||
F32 sloppy_decimator = indices_decimator / sloppy_decimation_step;
|
||||
U64Microseconds end_time = LLTimer::getTotalTime() + U64Seconds(5);
|
||||
|
||||
while (sloppy_ratio < 0
|
||||
&& sloppy_decimator > precise_ratio
|
||||
&& sloppy_decimator > 1)// precise_ratio isn't supposed to be below 1, but check just in case
|
||||
&& sloppy_decimator > 1 // precise_ratio isn't supposed to be below 1, but check just in case
|
||||
&& end_time > LLTimer::getTotalTime())
|
||||
{
|
||||
sloppy_ratio = genMeshOptimizerPerModel(base, target_model, sloppy_decimator, lod_error_threshold, MESH_OPTIMIZER_NO_TOPOLOGY);
|
||||
sloppy_decimator = sloppy_decimator / sloppy_decimation_step;
|
||||
|
|
|
|||
|
|
@ -1892,7 +1892,7 @@ void LLPanelEditWearable::onClickedImportBtnCallback(const std::vector<std::stri
|
|||
class LLMetricSystemHandler : public LLCommandHandler
|
||||
{
|
||||
public:
|
||||
LLMetricSystemHandler() : LLCommandHandler("metricsystem", UNTRUSTED_THROTTLE) { }
|
||||
LLMetricSystemHandler() : LLCommandHandler("metricsystem", UNTRUSTED_CLICK_ONLY) { }
|
||||
|
||||
bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -496,6 +496,30 @@ public:
|
|||
// requires trusted browser to trigger
|
||||
LLAgentHandler() : LLCommandHandler("agent", UNTRUSTED_THROTTLE) { }
|
||||
|
||||
virtual bool canHandleUntrusted(
|
||||
const LLSD& params,
|
||||
const LLSD& query_map,
|
||||
LLMediaCtrl* web,
|
||||
const std::string& nav_type)
|
||||
{
|
||||
if (params.size() < 2)
|
||||
{
|
||||
return true; // don't block, will fail later
|
||||
}
|
||||
|
||||
if (nav_type == NAV_TYPE_CLICKED)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
const std::string verb = params[1].asString();
|
||||
if (verb == "about" || verb == "inspect" || verb == "reportAbuse")
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool handle(const LLSD& params, const LLSD& query_map,
|
||||
LLMediaCtrl* web)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -84,6 +84,30 @@ public:
|
|||
std::set<LLUUID> mClassifiedIds;
|
||||
std::string mRequestVerb;
|
||||
|
||||
virtual bool canHandleUntrusted(
|
||||
const LLSD& params,
|
||||
const LLSD& query_map,
|
||||
LLMediaCtrl* web,
|
||||
const std::string& nav_type)
|
||||
{
|
||||
if (params.size() < 1)
|
||||
{
|
||||
return true; // don't block, will fail later
|
||||
}
|
||||
|
||||
if (nav_type == NAV_TYPE_CLICKED)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
const std::string verb = params[0].asString();
|
||||
if (verb == "create")
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
|
||||
{
|
||||
if (LLStartUp::getStartupState() < STATE_STARTED)
|
||||
|
|
|
|||
|
|
@ -65,6 +65,30 @@ public:
|
|||
// requires trusted browser to trigger
|
||||
LLPickHandler() : LLCommandHandler("pick", UNTRUSTED_THROTTLE) { }
|
||||
|
||||
virtual bool canHandleUntrusted(
|
||||
const LLSD& params,
|
||||
const LLSD& query_map,
|
||||
LLMediaCtrl* web,
|
||||
const std::string& nav_type)
|
||||
{
|
||||
if (params.size() < 1)
|
||||
{
|
||||
return true; // don't block, will fail later
|
||||
}
|
||||
|
||||
if (nav_type == NAV_TYPE_CLICKED)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
const std::string verb = params[0].asString();
|
||||
if (verb == "create")
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool handle(const LLSD& params, const LLSD& query_map,
|
||||
LLMediaCtrl* web)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -228,11 +228,103 @@
|
|||
class LLFloaterOpenHandler : public LLCommandHandler
|
||||
{
|
||||
public:
|
||||
// requires trusted browser to trigger
|
||||
// requires trusted browser to trigger or an explicit click
|
||||
LLFloaterOpenHandler() : LLCommandHandler("openfloater", UNTRUSTED_THROTTLE) { }
|
||||
|
||||
bool handle(const LLSD& params, const LLSD& query_map,
|
||||
LLMediaCtrl* web)
|
||||
bool canHandleUntrusted(
|
||||
const LLSD& params,
|
||||
const LLSD& query_map,
|
||||
LLMediaCtrl* web,
|
||||
const std::string& nav_type) override
|
||||
{
|
||||
if (params.size() != 1)
|
||||
{
|
||||
return true; // will fail silently
|
||||
}
|
||||
|
||||
std::string fl_name = params[0].asString();
|
||||
|
||||
if (nav_type == NAV_TYPE_CLICKED)
|
||||
{
|
||||
const std::list<std::string> blacklist_clicked = {
|
||||
"camera_presets",
|
||||
"delete_pref_preset",
|
||||
"forget_username",
|
||||
"god_tools",
|
||||
"group_picker",
|
||||
"hud",
|
||||
"incoming_call",
|
||||
"linkreplace",
|
||||
"message_critical", // Modal!!! Login specific.
|
||||
"message_tos", // Modal!!! Login specific.
|
||||
"save_pref_preset",
|
||||
"save_camera_preset",
|
||||
"region_restarting",
|
||||
"outfit_snapshot",
|
||||
"upload_anim_bvh",
|
||||
"upload_anim_anim",
|
||||
"upload_image",
|
||||
"upload_model",
|
||||
"upload_script",
|
||||
"upload_sound"
|
||||
};
|
||||
return std::find(blacklist_clicked.begin(), blacklist_clicked.end(), fl_name) == blacklist_clicked.end();
|
||||
}
|
||||
else
|
||||
{
|
||||
const std::list<std::string> blacklist_untrusted = {
|
||||
"360capture",
|
||||
"block_timers",
|
||||
"add_payment_method",
|
||||
"appearance",
|
||||
"associate_listing",
|
||||
"avatar_picker",
|
||||
"camera",
|
||||
"camera_presets",
|
||||
"classified",
|
||||
"add_landmark",
|
||||
"delete_pref_preset",
|
||||
"env_fixed_environmentent_water",
|
||||
"env_fixed_environmentent_sky",
|
||||
"env_edit_extdaycycle",
|
||||
"font_test",
|
||||
"forget_username",
|
||||
"god_tools",
|
||||
"group_picker",
|
||||
"hud",
|
||||
"incoming_call",
|
||||
"linkreplace",
|
||||
"mem_leaking",
|
||||
"marketplace_validation",
|
||||
"message_critical", // Modal!!! Login specific. If this is in use elsewhere, better to create a non modal variant
|
||||
"message_tos", // Modal!!! Login specific.
|
||||
"mute_object_by_name",
|
||||
"publish_classified",
|
||||
"save_pref_preset",
|
||||
"save_camera_preset",
|
||||
"region_restarting",
|
||||
"script_debug",
|
||||
"script_debug_output",
|
||||
"sell_land",
|
||||
"outfit_snapshot",
|
||||
"upload_anim_bvh",
|
||||
"upload_anim_anim",
|
||||
"upload_image",
|
||||
"upload_model",
|
||||
"upload_script",
|
||||
"upload_sound"
|
||||
};
|
||||
return std::find(blacklist_untrusted.begin(), blacklist_untrusted.end(), fl_name) == blacklist_untrusted.end();
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool handle(
|
||||
const LLSD& params,
|
||||
const LLSD& query_map,
|
||||
LLMediaCtrl* web) override
|
||||
{
|
||||
if (params.size() != 1)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -235,7 +235,7 @@ class LLInventoryHandler : public LLCommandHandler
|
|||
{
|
||||
public:
|
||||
// requires trusted browser to trigger
|
||||
LLInventoryHandler() : LLCommandHandler("inventory", UNTRUSTED_THROTTLE) { }
|
||||
LLInventoryHandler() : LLCommandHandler("inventory", UNTRUSTED_CLICK_ONLY) { }
|
||||
|
||||
bool handle(const LLSD& params, const LLSD& query_map,
|
||||
LLMediaCtrl* web)
|
||||
|
|
|
|||
|
|
@ -6896,9 +6896,6 @@ class LLToolsSelectNextPartFace : public view_listener_t
|
|||
}
|
||||
}
|
||||
LLSelectMgr::getInstance()->selectObjectOnly(to_select, new_te);
|
||||
|
||||
// <FS:Zi> Add this back in additionally to selectObjectOnly() to get the lastOperadedTE()
|
||||
// function back working to properly shift+cycle through faces
|
||||
LLSelectMgr::getInstance()->addAsIndividual(to_select, new_te, false);
|
||||
}
|
||||
else
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
text_pad_left="4"
|
||||
select_on_focus="true"
|
||||
text_tentative_color="TextFgTentativeColor"
|
||||
highlight_text_field="false"
|
||||
highlight_text_field="true"
|
||||
background_image="TextField_Off"
|
||||
background_image_disabled="TextField_Disabled"
|
||||
background_image_focused="TextField_Active"
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
text_pad_right="2"
|
||||
select_on_focus="true"
|
||||
text_tentative_color="TextFgTentativeColor"
|
||||
highlight_text_field="false"
|
||||
highlight_text_field="true"
|
||||
background_image="TextField_Off"
|
||||
background_image_disabled="TextField_Disabled"
|
||||
background_image_focused="TextField_Active"
|
||||
|
|
|
|||
|
|
@ -82,17 +82,20 @@
|
|||
width="62">
|
||||
Name
|
||||
</text>
|
||||
<line_editor
|
||||
border_style="line"
|
||||
border_thickness="1"
|
||||
|
||||
<search_editor
|
||||
follows="left|top"
|
||||
search_button_visible="false"
|
||||
height="20"
|
||||
text_readonly_color="DkGray"
|
||||
label="Objects by Name"
|
||||
layout="topleft"
|
||||
left_pad="0"
|
||||
top_pad="-18"
|
||||
max_length_chars="255"
|
||||
name="filter_by_name"
|
||||
width="161" />
|
||||
select_on_focus="true"
|
||||
width="161">
|
||||
</search_editor>
|
||||
<text
|
||||
name="linksets_desc_label"
|
||||
height="13"
|
||||
|
|
@ -108,17 +111,19 @@
|
|||
width="88">
|
||||
Description
|
||||
</text>
|
||||
<line_editor
|
||||
border_style="line"
|
||||
border_thickness="1"
|
||||
<search_editor
|
||||
follows="left|top"
|
||||
search_button_visible="false"
|
||||
height="20"
|
||||
text_readonly_color="DkGray"
|
||||
label="Objects by Description"
|
||||
layout="topleft"
|
||||
left_pad="0"
|
||||
top_pad="-17"
|
||||
max_length_chars="255"
|
||||
name="filter_by_description"
|
||||
width="162" />
|
||||
select_on_focus="true"
|
||||
width="162">
|
||||
</search_editor>
|
||||
<combo_box
|
||||
height="20"
|
||||
layout="topleft"
|
||||
|
|
|
|||
|
|
@ -2504,7 +2504,7 @@ If you continue to experience problems, please check your network and firewall s
|
|||
<string name="Premium_PlusMembership">Premium Plus</string>
|
||||
<string name="InternalMembership">Internal</string> <!-- No need to translate -->
|
||||
|
||||
<string name="MembershipUpgradeText">Upgrade to Premium</string>
|
||||
<string name="MembershipUpgradeText">Change membership plan...</string>
|
||||
<string name="MembershipPremiumText">My Premium membership</string>
|
||||
|
||||
<!-- Question strings for delete items notifications -->
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
text_pad_left="10"
|
||||
select_on_focus="true"
|
||||
text_tentative_color="TextFgTentativeColor"
|
||||
highlight_text_field="false"
|
||||
highlight_text_field="true"
|
||||
background_image="TextField_Search_Off"
|
||||
background_image_disabled="TextField_Search_Disabled"
|
||||
background_image_focused="TextField_Search_Active"
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
text_pad_right="6"
|
||||
select_on_focus="true"
|
||||
text_tentative_color="TextFgTentativeColor"
|
||||
highlight_text_field="false"
|
||||
highlight_text_field="true"
|
||||
background_image="TextField_Search_Off"
|
||||
background_image_disabled="TextField_Search_Disabled"
|
||||
background_image_focused="TextField_Search_Active"
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
text_pad_left="7"
|
||||
select_on_focus="true"
|
||||
text_tentative_color="TextFgTentativeColor"
|
||||
highlight_text_field="false"
|
||||
highlight_text_field="true"
|
||||
background_image="TextField_Off"
|
||||
background_image_disabled="TextField_Disabled"
|
||||
background_image_focused="TextField_Active"
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
text_pad_right="6"
|
||||
select_on_focus="true"
|
||||
text_tentative_color="TextFgTentativeColor"
|
||||
highlight_text_field="false"
|
||||
highlight_text_field="true"
|
||||
background_image="TextField_Off"
|
||||
background_image_disabled="TextField_Disabled"
|
||||
background_image_focused="TextField_Active"
|
||||
|
|
|
|||
Loading…
Reference in New Issue