summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/lluilistener.cpp34
-rw-r--r--indra/newview/lluilistener.h6
-rw-r--r--indra/newview/llviewermenu.cpp38
3 files changed, 46 insertions, 32 deletions
diff --git a/indra/newview/lluilistener.cpp b/indra/newview/lluilistener.cpp
index 938ef95b5c..40f276b478 100644
--- a/indra/newview/lluilistener.cpp
+++ b/indra/newview/lluilistener.cpp
@@ -38,7 +38,8 @@
#include "lluictrl.h"
#include "llerror.h"
-#define THROTTLE_PERIOD 1 // required seconds between throttled functions
+#define THROTTLE_PERIOD 1.5 // required seconds between throttled functions
+#define MIN_THROTTLE 0.5
LLUIListener::LLUIListener():
LLEventAPI("UI",
@@ -58,9 +59,9 @@ LLUIListener::LLUIListener():
LLSDMap("path", LLSD())("reply", LLSD()));
}
-void LLUIListener::call(const LLSD& event) const
+typedef LLUICtrl::LLCommitCallbackInfo cb_info;
+void LLUIListener::call(const LLSD& event)
{
- static F64 last_throttle_time = 0.0;
Response response(LLSD(), event);
LLUICtrl::LLCommitCallbackInfo *info = LLUICtrl::SharedCommitCallbackRegistry::getValue(event["function"]);
if (!info )
@@ -68,21 +69,30 @@ void LLUIListener::call(const LLSD& event) const
response.error(STRINGIZE("Function " << std::quoted(event["function"].asString()) << "was not found"));
return;
}
- if (info->mHandleUntrusted == LLUICtrl::LLCommitCallbackInfo::UNTRUSTED_BLOCK)
+ if (info->mHandleUntrusted == cb_info::UNTRUSTED_BLOCK)
{
response.error(STRINGIZE("Function " << std::quoted(event["function"].asString()) << " is not allowed to be called from the script"));
return;
}
- if (info->mHandleUntrusted == LLUICtrl::LLCommitCallbackInfo::UNTRUSTED_THROTTLE)
+ F64 cur_time = LLTimer::getElapsedSeconds();
+ bool is_untrusted_throttle = info->mHandleUntrusted == cb_info::UNTRUSTED_THROTTLE;
+
+ //Separate UNTRUSTED_THROTTLE and UNTRUSTED_ALLOW functions to have different timeout
+ F64 time_delta = is_untrusted_throttle ? mLastUntrustedThrottle + THROTTLE_PERIOD : mLastMinThrottle + MIN_THROTTLE;
+ if (cur_time < time_delta)
+ {
+ LL_WARNS("LLUIListener") << "Throttled function " << std::quoted(event["function"].asString()) << LL_ENDL;
+ return;
+ }
+ if (is_untrusted_throttle)
{
- F64 cur_time = LLTimer::getElapsedSeconds();
- if (cur_time < last_throttle_time + THROTTLE_PERIOD)
- {
- LL_WARNS("LLUIListener") << "Throttled function " << std::quoted(event["function"].asString()) << LL_ENDL;
- return;
- }
- last_throttle_time = cur_time;
+ mLastUntrustedThrottle = cur_time;
}
+ else
+ {
+ mLastMinThrottle = cur_time;
+ }
+
LLUICtrl::commit_callback_t func = info->callback_func;
diff --git a/indra/newview/lluilistener.h b/indra/newview/lluilistener.h
index e53984dae2..790284a27a 100644
--- a/indra/newview/lluilistener.h
+++ b/indra/newview/lluilistener.h
@@ -41,8 +41,12 @@ public:
// FIXME These fields are intended to be private, changed here to support very hacky code in llluamanager.cpp
public:
- void call(const LLSD& event) const;
+ void call(const LLSD& event);
void getValue(const LLSD&event) const;
+
+ private:
+ F64 mLastUntrustedThrottle {0.f};
+ F64 mLastMinThrottle {0.f};
};
#endif /* ! defined(LL_LLUILISTENER_H) */
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 83ffa2ae59..4452f0ebda 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -9398,6 +9398,7 @@ void initialize_edit_menu()
typedef LLUICtrl::LLCommitCallbackInfo cb_info;
#define COMMIT_ADD(func_name, func) LLUICtrl::SharedCommitCallbackRegistry::currentRegistrar().add(func_name, cb_info(func))
#define COMMIT_ADD_TRUSTED(func_name, func) LLUICtrl::SharedCommitCallbackRegistry::currentRegistrar().add(func_name, cb_info(func, cb_info::UNTRUSTED_BLOCK))
+#define COMMIT_ADD_THROTTLE(func_name, func) LLUICtrl::SharedCommitCallbackRegistry::currentRegistrar().add(func_name, cb_info(func, cb_info::UNTRUSTED_THROTTLE))
void initialize_spellcheck_menu()
{
@@ -9553,8 +9554,8 @@ void initialize_menus()
view_listener_t::addMenu(new LLToolsReleaseKeys(), "Tools.ReleaseKeys");
view_listener_t::addMenu(new LLToolsEnableReleaseKeys(), "Tools.EnableReleaseKeys");
COMMIT_ADD("Tools.LookAtSelection", boost::bind(&handle_look_at_selection, _2));
- COMMIT_ADD("Tools.BuyOrTake", boost::bind(&handle_buy_or_take));
- COMMIT_ADD("Tools.TakeCopy", boost::bind(&handle_take_copy));
+ COMMIT_ADD_THROTTLE("Tools.BuyOrTake", boost::bind(&handle_buy_or_take));
+ COMMIT_ADD_THROTTLE("Tools.TakeCopy", boost::bind(&handle_take_copy));
view_listener_t::addMenu(new LLToolsSaveToObjectInventory(), "Tools.SaveToObjectInventory");
view_listener_t::addMenu(new LLToolsSelectedScriptAction(), "Tools.SelectedScriptAction");
@@ -9642,7 +9643,7 @@ void initialize_menus()
view_listener_t::addMenu(new LLAdvancedBuyCurrencyTest(), "Advanced.BuyCurrencyTest");
view_listener_t::addMenu(new LLAdvancedDumpSelectMgr(), "Advanced.DumpSelectMgr");
view_listener_t::addMenu(new LLAdvancedDumpInventory(), "Advanced.DumpInventory");
- COMMIT_ADD("Advanced.DumpTimers", boost::bind(&handle_dump_timers) );
+ COMMIT_ADD_THROTTLE("Advanced.DumpTimers", boost::bind(&handle_dump_timers));
COMMIT_ADD("Advanced.DumpFocusHolder", boost::bind(&handle_dump_focus) );
view_listener_t::addMenu(new LLAdvancedPrintSelectedObjectInfo(), "Advanced.PrintSelectedObjectInfo");
view_listener_t::addMenu(new LLAdvancedPrintAgentInfo(), "Advanced.PrintAgentInfo");
@@ -9668,7 +9669,7 @@ void initialize_menus()
view_listener_t::addMenu(new LLAdvancedToggleXUINames(), "Advanced.ToggleXUINames");
view_listener_t::addMenu(new LLAdvancedCheckXUINames(), "Advanced.CheckXUINames");
view_listener_t::addMenu(new LLAdvancedSendTestIms(), "Advanced.SendTestIMs");
- COMMIT_ADD("Advanced.FlushNameCaches", boost::bind(&handle_flush_name_caches));
+ COMMIT_ADD_TRUSTED("Advanced.FlushNameCaches", boost::bind(&handle_flush_name_caches));
// Advanced > Character > Grab Baked Texture
view_listener_t::addMenu(new LLAdvancedGrabBakedTexture(), "Advanced.GrabBakedTexture");
@@ -9739,7 +9740,7 @@ void initialize_menus()
view_listener_t::addMenu(new LLAdvancedToggleShowObjectUpdates(), "Advanced.ToggleShowObjectUpdates");
view_listener_t::addMenu(new LLAdvancedCheckShowObjectUpdates(), "Advanced.CheckShowObjectUpdates");
view_listener_t::addMenu(new LLAdvancedCompressImage(), "Advanced.CompressImage");
- view_listener_t::addMenu(new LLAdvancedCompressFileTest(), "Advanced.CompressFileTest");
+ view_listener_t::addMenu(new LLAdvancedCompressFileTest(), "Advanced.CompressFileTest", cb_info::UNTRUSTED_BLOCK);
view_listener_t::addMenu(new LLAdvancedShowDebugSettings(), "Advanced.ShowDebugSettings");
view_listener_t::addMenu(new LLAdvancedEnableViewAdminOptions(), "Advanced.EnableViewAdminOptions");
view_listener_t::addMenu(new LLAdvancedToggleViewAdminOptions(), "Advanced.ToggleViewAdminOptions");
@@ -9754,11 +9755,11 @@ void initialize_menus()
view_listener_t::addMenu(new LLDevelopSetLoggingLevel(), "Develop.SetLoggingLevel");
//Develop (clear cache immediately)
- COMMIT_ADD("Develop.ClearCache", boost::bind(&handle_cache_clear_immediately) );
+ COMMIT_ADD_TRUSTED("Develop.ClearCache", boost::bind(&handle_cache_clear_immediately) );
// Develop (Fonts debugging)
- COMMIT_ADD("Develop.Fonts.Dump", boost::bind(&LLFontGL::dumpFonts));
- COMMIT_ADD("Develop.Fonts.DumpTextures", boost::bind(&LLFontGL::dumpFontTextures));
+ COMMIT_ADD_THROTTLE("Develop.Fonts.Dump", boost::bind(&LLFontGL::dumpFonts));
+ COMMIT_ADD_THROTTLE("Develop.Fonts.DumpTextures", boost::bind(&LLFontGL::dumpFontTextures));
// Admin >Object
view_listener_t::addMenu(new LLAdminForceTakeCopy(), "Admin.ForceTakeCopy");
@@ -9802,13 +9803,13 @@ void initialize_menus()
COMMIT_ADD("Avatar.Eject", boost::bind(&handle_avatar_eject, LLSD()));
COMMIT_ADD("Avatar.ShowInspector", boost::bind(&handle_avatar_show_inspector));
view_listener_t::addMenu(new LLAvatarSendIM(), "Avatar.SendIM");
- view_listener_t::addMenu(new LLAvatarCall(), "Avatar.Call");
+ view_listener_t::addMenu(new LLAvatarCall(), "Avatar.Call", cb_info::UNTRUSTED_BLOCK);
enable.add("Avatar.EnableCall", boost::bind(&LLAvatarActions::canCall));
- view_listener_t::addMenu(new LLAvatarReportAbuse(), "Avatar.ReportAbuse");
+ view_listener_t::addMenu(new LLAvatarReportAbuse(), "Avatar.ReportAbuse", cb_info::UNTRUSTED_THROTTLE);
view_listener_t::addMenu(new LLAvatarToggleMyProfile(), "Avatar.ToggleMyProfile");
view_listener_t::addMenu(new LLAvatarTogglePicks(), "Avatar.TogglePicks");
view_listener_t::addMenu(new LLAvatarToggleSearch(), "Avatar.ToggleSearch");
- view_listener_t::addMenu(new LLAvatarResetSkeleton(), "Avatar.ResetSkeleton");
+ view_listener_t::addMenu(new LLAvatarResetSkeleton(), "Avatar.ResetSkeleton", cb_info::UNTRUSTED_THROTTLE);
view_listener_t::addMenu(new LLAvatarEnableResetSkeleton(), "Avatar.EnableResetSkeleton");
view_listener_t::addMenu(new LLAvatarResetSkeletonAndAnimations(), "Avatar.ResetSkeletonAndAnimations");
view_listener_t::addMenu(new LLAvatarResetSelfSkeletonAndAnimations(), "Avatar.ResetSelfSkeletonAndAnimations");
@@ -9830,14 +9831,13 @@ void initialize_menus()
view_listener_t::addMenu(new LLObjectAttachToAvatar(false), "Object.AttachAddToAvatar");
view_listener_t::addMenu(new LLObjectReturn(), "Object.Return");
COMMIT_ADD("Object.Duplicate", boost::bind(&LLSelectMgr::duplicate, LLSelectMgr::getInstance()));
- view_listener_t::addMenu(new LLObjectReportAbuse(), "Object.ReportAbuse");
+ view_listener_t::addMenu(new LLObjectReportAbuse(), "Object.ReportAbuse", cb_info::UNTRUSTED_THROTTLE);
view_listener_t::addMenu(new LLObjectMute(), "Object.Mute");
enable.add("Object.VisibleTake", boost::bind(&visible_take_object));
enable.add("Object.VisibleBuy", boost::bind(&visible_buy_object));
- COMMIT_ADD("Object.Buy", boost::bind(&handle_buy));
- COMMIT_ADD("Object.Edit", boost::bind(&handle_object_edit));
+ COMMIT_ADD_THROTTLE("Object.Buy", boost::bind(&handle_buy));
COMMIT_ADD("Object.Edit", boost::bind(&handle_object_edit));
COMMIT_ADD("Object.EditGLTFMaterial", boost::bind(&handle_object_edit_gltf_material));
COMMIT_ADD("Object.Inspect", boost::bind(&handle_object_inspect));
@@ -9884,14 +9884,14 @@ void initialize_menus()
view_listener_t::addMenu(new LLMuteParticle(), "Particle.Mute");
view_listener_t::addMenu(new LLLandEnableBuyPass(), "Land.EnableBuyPass");
- COMMIT_ADD("Land.Buy", boost::bind(&handle_buy_land));
+ COMMIT_ADD_THROTTLE("Land.Buy", boost::bind(&handle_buy_land));
// Generic actions
- COMMIT_ADD("ReportAbuse", boost::bind(&handle_report_abuse));
- COMMIT_ADD("BuyCurrency", boost::bind(&handle_buy_currency));
+ COMMIT_ADD_THROTTLE("ReportAbuse", boost::bind(&handle_report_abuse));
+ COMMIT_ADD_THROTTLE("BuyCurrency", boost::bind(&handle_buy_currency));
view_listener_t::addMenu(new LLShowHelp(), "ShowHelp");
view_listener_t::addMenu(new LLToggleHelp(), "ToggleHelp");
- view_listener_t::addMenu(new LLToggleSpeak(), "ToggleSpeak");
+ view_listener_t::addMenu(new LLToggleSpeak(), "ToggleSpeak", cb_info::UNTRUSTED_BLOCK);
view_listener_t::addMenu(new LLPromptShowURL(), "PromptShowURL");
view_listener_t::addMenu(new LLShowAgentProfile(), "ShowAgentProfile");
view_listener_t::addMenu(new LLShowAgentProfilePicks(), "ShowAgentProfilePicks");
@@ -9902,7 +9902,7 @@ void initialize_menus()
view_listener_t::addMenu(new LLGoToObject(), "GoToObject");
COMMIT_ADD("PayObject", boost::bind(&handle_give_money_dialog));
- COMMIT_ADD("Inventory.NewWindow", boost::bind(&LLPanelMainInventory::newWindow));
+ COMMIT_ADD_THROTTLE("Inventory.NewWindow", boost::bind(&LLPanelMainInventory::newWindow));
enable.add("EnablePayObject", boost::bind(&enable_pay_object));
enable.add("EnablePayAvatar", boost::bind(&enable_pay_avatar));