diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaBrowserDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaBrowserDefs.cpp index 06ce7a875b..97fb1b682a 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaBrowserDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaBrowserDefs.cpp @@ -11,44 +11,45 @@ #include "StdInc.h" #include "lua/CLuaFunctionParser.h" +#include #include void CLuaBrowserDefs::LoadFunctions() { // Define browser functions constexpr static const std::pair functions[]{ - {"createBrowser", CreateBrowser}, - {"requestBrowserDomains", RequestBrowserDomains}, - {"loadBrowserURL", LoadBrowserURL}, - {"isBrowserLoading", IsBrowserLoading}, - {"injectBrowserMouseMove", InjectBrowserMouseMove}, - {"injectBrowserMouseDown", InjectBrowserMouseDown}, - {"injectBrowserMouseUp", InjectBrowserMouseUp}, - {"injectBrowserMouseWheel", InjectBrowserMouseWheel}, - {"getBrowserTitle", GetBrowserTitle}, - {"getBrowserURL", GetBrowserURL}, - {"setBrowserRenderingPaused", SetBrowserRenderingPaused}, + {"createBrowser", ArgumentParserWarn}, + {"requestBrowserDomains", ArgumentParserWarn}, + {"loadBrowserURL", ArgumentParserWarn}, + {"isBrowserLoading", ArgumentParserWarn}, + {"injectBrowserMouseMove", ArgumentParserWarn}, + {"injectBrowserMouseDown", ArgumentParserWarn}, + {"injectBrowserMouseUp", ArgumentParserWarn}, + {"injectBrowserMouseWheel", ArgumentParserWarn}, + {"getBrowserTitle", ArgumentParserWarn}, + {"getBrowserURL", ArgumentParserWarn}, + {"setBrowserRenderingPaused", ArgumentParserWarn}, {"isBrowserRenderingPaused", ArgumentParser}, - {"executeBrowserJavascript", ExecuteBrowserJavascript}, - {"getBrowserVolume", GetBrowserVolume}, - {"setBrowserVolume", SetBrowserVolume}, - {"isBrowserDomainBlocked", IsBrowserDomainBlocked}, - {"focusBrowser", FocusBrowser}, - {"isBrowserFocused", IsBrowserFocused}, - {"setBrowserProperty", SetBrowserProperty}, - {"getBrowserProperty", GetBrowserProperty}, - {"getBrowserSettings", GetBrowserSettings}, - {"getBrowserSource", GetBrowserSource}, - {"setBrowserAjaxHandler", SetBrowserAjaxHandler}, - {"canBrowserNavigateBack", CanBrowserNavigateBack}, - {"canBrowserNavigateForward", CanBrowserNavigateForward}, - {"navigateBrowserBack", NavigateBrowserBack}, - {"navigateBrowserForward", NavigateBrowserForward}, - {"reloadBrowserPage", ReloadBrowserPage}, - {"toggleBrowserDevTools", ToggleBrowserDevTools}, - {"resizeBrowser", ResizeBrowser}, - {"guiCreateBrowser", GUICreateBrowser}, - {"guiGetBrowser", GUIGetBrowser}, + {"executeBrowserJavascript", ArgumentParserWarn}, + {"getBrowserVolume", ArgumentParserWarn}, + {"setBrowserVolume", ArgumentParserWarn}, + {"isBrowserDomainBlocked", ArgumentParserWarn}, + {"focusBrowser", ArgumentParserWarn}, + {"isBrowserFocused", ArgumentParserWarn}, + {"setBrowserProperty", ArgumentParserWarn}, + {"getBrowserProperty", ArgumentParserWarn}, + {"getBrowserSettings", ArgumentParserWarn}, + {"getBrowserSource", ArgumentParserWarn}, + {"setBrowserAjaxHandler", ArgumentParserWarn}, + {"canBrowserNavigateBack", ArgumentParserWarn}, + {"canBrowserNavigateForward", ArgumentParserWarn}, + {"navigateBrowserBack", ArgumentParserWarn}, + {"navigateBrowserForward", ArgumentParserWarn}, + {"reloadBrowserPage", ArgumentParserWarn}, + {"toggleBrowserDevTools", ArgumentParserWarn}, + {"resizeBrowser", ArgumentParserWarn}, + {"guiCreateBrowser", ArgumentParserWarn}, + {"guiGetBrowser", ArgumentParserWarn}, {"isBrowserGPUEnabled", ArgumentParser}, }; @@ -110,371 +111,177 @@ void CLuaBrowserDefs::AddClass(lua_State* luaVM) lua_registerclass(luaVM, "GuiBrowser", "GuiElement"); } -int CLuaBrowserDefs::CreateBrowser(lua_State* luaVM) +std::variant CLuaBrowserDefs::CreateBrowser(lua_State* luaVM, CVector2D size, bool isLocal, std::optional transparent) { // texture createBrowser ( int width, int height, bool isLocal [, bool transparent = false] ) - CVector2D vecSize; - bool bIsLocal; - bool bTransparent; + if (size.fX < 0) + throw std::invalid_argument("Browser width is smaller than 0"); + else if (size.fY < 0) + throw std::invalid_argument("Browser height is smaller than 0"); + else if (size.fX == 0 || size.fY == 0) + throw std::invalid_argument("A browser must be at least 1x1 in size."); - CScriptArgReader argStream(luaVM); - argStream.ReadVector2D(vecSize); - argStream.ReadBool(bIsLocal); - argStream.ReadBool(bTransparent, false); + const auto webCore = g_pCore->GetWebCore(); + if (!webCore) + return false; - if (!argStream.HasErrors()) - { - if (vecSize.fX < 0) - { - argStream.SetCustomError("Browser width is smaller than 0", "Invalid parameter"); - } - else if (vecSize.fY < 0) - { - argStream.SetCustomError("Browser height is smaller than 0", "Invalid parameter"); - } - else if (vecSize.fX == 0 || vecSize.fY == 0) - { - argStream.SetCustomError("A browser must be at least 1x1 in size.", "Invalid parameter"); - } - } - - if (argStream.HasErrors()) - return luaL_error(luaVM, argStream.GetFullErrorMessage()); + if (!isLocal && !webCore->GetRemotePagesEnabled()) + return false; - const auto pWebCore = g_pCore->GetWebCore(); - if (!pWebCore) + CLuaMain* luaMain = m_pLuaManager->GetVirtualMachine(luaVM); + if (luaMain) { - lua_pushboolean(luaVM, false); - return 1; - } + CResource* parentResource = luaMain->GetResource(); - if (!bIsLocal && !pWebCore->GetRemotePagesEnabled()) - { - lua_pushboolean(luaVM, false); - return 1; - } - - CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine(luaVM); - if (pLuaMain) - { - CResource* pParentResource = pLuaMain->GetResource(); + CClientWebBrowser* browserTexture = g_pClientGame->GetManager()->GetRenderElementManager()->CreateWebBrowser( + static_cast(size.fX), static_cast(size.fY), isLocal, transparent.value_or(false)); - CClientWebBrowser* pBrowserTexture = - g_pClientGame->GetManager()->GetRenderElementManager()->CreateWebBrowser((int)vecSize.fX, (int)vecSize.fY, bIsLocal, bTransparent); - if (pBrowserTexture) + if (browserTexture) { - // Make it a child of the resource's file root ** CHECK Should parent be pFileResource, and element added to pParentResource's ElementGroup? ** - pBrowserTexture->SetParent(pParentResource->GetResourceDynamicEntity()); + // Make it a child of the resource's file root ** CHECK Should parent be fileResource, and element added to parentResource's ElementGroup? ** + browserTexture->SetParent(parentResource->GetResourceDynamicEntity()); // Set our owner resource - pBrowserTexture->SetResource(pParentResource); + browserTexture->SetResource(parentResource); } - lua_pushelement(luaVM, pBrowserTexture); - return 1; + + return browserTexture; } - lua_pushboolean(luaVM, false); - return 1; + return false; } -int CLuaBrowserDefs::RequestBrowserDomains(lua_State* luaVM) +bool CLuaBrowserDefs::RequestBrowserDomains(lua_State* luaVM, std::vector pages, std::optional isURL, + std::optional callbackFunction) { // bool requestBrowserDomains ( table domains, bool isURL [, function callback ] ) - std::vector pages; - bool bIsURL; - CLuaFunctionRef callbackFunction; + std::vector urls(pages.begin(), pages.end()); - CScriptArgReader argStream(luaVM); - argStream.ReadStringTable(pages); - argStream.ReadBool(bIsURL, false); - argStream.ReadFunction(callbackFunction, LUA_REFNIL); - argStream.ReadFunctionComplete(); + // Remove whitespaces + for (auto& url : urls) + url.erase(std::remove_if(url.begin(), url.end(), [](unsigned char c) { return std::isspace(c); }), url.end()); - if (!argStream.HasErrors()) - { - // Remove whitespaces - for (auto& url : pages) - url.erase(std::remove_if(url.begin(), url.end(), [](unsigned char c) { return std::isspace(c); }), url.end()); + // Remove empty and invalid URLs + std::regex invalidSynmbolsRegex("[^A-Za-z0-9._~!#$&'()*+,;=:@/?%-]"); - // Remove empty and invalid URLs - std::regex invalidSynmbolsRegex("[^A-Za-z0-9._~!#$&'()*+,;=:@/?%-]"); + urls.erase(std::remove_if(urls.begin(), urls.end(), + [&invalidSynmbolsRegex](const auto& url) { return url.empty() || std::regex_search(url, invalidSynmbolsRegex); }), + urls.end()); - pages.erase(std::remove_if(pages.begin(), pages.end(), - [&invalidSynmbolsRegex](const auto& url) { return url.empty() || std::regex_search(url, invalidSynmbolsRegex); }), - pages.end()); + // Convert to domains if we got a list of URLs + if (isURL.value_or(false)) + { + auto webCore = g_pCore->GetWebCore(); + if (!webCore) + return false; + std::transform(urls.begin(), urls.end(), urls.begin(), [webCore](const auto& url) { return webCore->GetDomainFromURL(url); }); + } - // Convert to domains if we got a list of URLs - if (bIsURL) + CLuaFunctionRef functionRef = callbackFunction.value_or(CLuaFunctionRef()); + WebRequestCallback callback = [=](bool allow, const std::unordered_set& domains) + { + // Test if luaVM is still available + if (m_pLuaManager->IsLuaVMValid(luaVM) && VERIFY_FUNCTION(functionRef)) { - auto pWebCore = g_pCore->GetWebCore(); - if (!pWebCore) - { - lua_pushboolean(luaVM, false); - return 1; - } - std::transform(pages.begin(), pages.end(), pages.begin(), [pWebCore](const auto& url) { return pWebCore->GetDomainFromURL(url); }); - } + CLuaMain* luaMain = m_pLuaManager->GetVirtualMachine(luaVM); - WebRequestCallback callback = [=](bool bAllow, const std::unordered_set& domains) - { - // Test if luaVM is still available - if (m_pLuaManager->IsLuaVMValid(luaVM) && VERIFY_FUNCTION(callbackFunction)) - { - CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine(luaVM); - if (!pLuaMain) - return; + if (!luaMain) + return; - CLuaArguments arguments; - arguments.PushBoolean(bAllow); + CLuaArguments arguments; + arguments.PushBoolean(allow); - CLuaArguments LuaTable; - int i = 0; - for (const auto& domain : domains) - { - LuaTable.PushNumber(++i); - LuaTable.PushString(domain); - } - arguments.PushTable(&LuaTable); - arguments.Call(pLuaMain, callbackFunction); + CLuaArguments LuaTable; + int i = 0; + + for (const auto& domain : domains) + { + LuaTable.PushNumber(++i); + LuaTable.PushString(domain); } - }; - auto pWebCore = g_pCore->GetWebCore(); - if (!pWebCore) - { - lua_pushboolean(luaVM, false); - return 1; + arguments.PushTable(&LuaTable); + arguments.Call(luaMain, functionRef); } - pWebCore->RequestPages(pages, VERIFY_FUNCTION(callbackFunction) ? &callback : nullptr); - lua_pushboolean(luaVM, true); - return 1; - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + }; + + auto webCore = g_pCore->GetWebCore(); + + if (!webCore) + return false; + + webCore->RequestPages(urls, VERIFY_FUNCTION(functionRef) ? &callback : nullptr); - lua_pushboolean(luaVM, false); - return 1; + return true; } -int CLuaBrowserDefs::LoadBrowserURL(lua_State* luaVM) +bool CLuaBrowserDefs::LoadBrowserURL(CClientWebBrowser* browser, const std::string url, std::optional postData, std::optional urlEncoded) { // bool loadBrowserURL ( browser webBrowser, string url [, string postData = "", bool postURLEncoded = true ] ) - CClientWebBrowser* pWebBrowser; - SString strURL; - SString strPostData; - bool bURLEncoded; - - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pWebBrowser); - argStream.ReadString(strURL); - argStream.ReadString(strPostData, ""); - argStream.ReadBool(bURLEncoded, true); - - if (!argStream.HasErrors()) + // Are we dealing with a remote website? + if (url.substr(0, 7) == "http://" || url.substr(0, 8) == "https://") { - // Are we dealing with a remote website? - if (strURL.substr(0, 7) == "http://" || strURL.substr(0, 8) == "https://") - { - bool isLocalURL = strURL.substr(0, 11) == "http://mta/"; - if (pWebBrowser->IsLocal() != isLocalURL) - { - lua_pushboolean(luaVM, false); - return 1; - } + bool isLocalURL = url.substr(0, 11) == "http://mta/"; + if (browser->IsLocal() != isLocalURL) + return false; - lua_pushboolean(luaVM, pWebBrowser->LoadURL(strURL, !isLocalURL, strPostData, bURLEncoded)); - return 1; - } - else - { - argStream.SetCustomError("Invalid URL scheme provided. Only http:// and https:// is supported.", "Invalid parameter"); - } + return browser->LoadURL(url, !isLocalURL, postData.value_or(""), urlEncoded.value_or(true)); } - if (argStream.HasErrors()) - return luaL_error(luaVM, argStream.GetFullErrorMessage()); - - lua_pushboolean(luaVM, false); - return 1; + throw std::invalid_argument("Invalid URL scheme provided. Only http:// and https:// is supported."); } -int CLuaBrowserDefs::IsBrowserLoading(lua_State* luaVM) +bool CLuaBrowserDefs::IsBrowserLoading(CClientWebBrowser* browser) { // bool isBrowserLoading(browser webBrowser) - CClientWebBrowser* pWebBrowser; - - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pWebBrowser); - - if (!argStream.HasErrors()) - { - lua_pushboolean(luaVM, pWebBrowser->IsLoading()); - return 1; - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushnil(luaVM); - return 1; + return browser->IsLoading(); } -int CLuaBrowserDefs::InjectBrowserMouseMove(lua_State* luaVM) +bool CLuaBrowserDefs::InjectBrowserMouseMove(CClientWebBrowser* browser, CVector2D position) { // bool injectBrowserMouseMove(browser webBrowser, int x, int y) - CClientWebBrowser* pWebBrowser; - CVector2D vecPosition; - - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pWebBrowser); - argStream.ReadVector2D(vecPosition); - - if (!argStream.HasErrors()) - { - pWebBrowser->InjectMouseMove((int)vecPosition.fX, (int)vecPosition.fY); - lua_pushboolean(luaVM, true); - return 1; - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushboolean(luaVM, false); - return 1; + browser->InjectMouseMove(static_cast(position.fX), static_cast(position.fY)); + return true; } -int CLuaBrowserDefs::InjectBrowserMouseDown(lua_State* luaVM) +bool CLuaBrowserDefs::InjectBrowserMouseDown(CClientWebBrowser* browser, eWebBrowserMouseButton mouseButton, std::optional doubleClick) { // bool injectBrowserMouseDown ( browser webBrowser, string mouseButton [ , bool doubleClick = false ] ) - CClientWebBrowser* pWebBrowser{}; - eWebBrowserMouseButton mouseButton{}; - bool doubleClick{}; - - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pWebBrowser); - argStream.ReadEnumString(mouseButton); - argStream.ReadBool(doubleClick, false); - - if (!argStream.HasErrors()) - { - pWebBrowser->InjectMouseDown(mouseButton, doubleClick ? 2 : 1); - lua_pushboolean(luaVM, true); - return 1; - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushboolean(luaVM, false); - return 1; + browser->InjectMouseDown(mouseButton, doubleClick.value_or(false) ? 2 : 1); + return true; } -int CLuaBrowserDefs::InjectBrowserMouseUp(lua_State* luaVM) +bool CLuaBrowserDefs::InjectBrowserMouseUp(CClientWebBrowser* browser, eWebBrowserMouseButton mouseButton) { // bool injectBrowserMouseUp ( browser webBrowser, string mouseButton ) - CClientWebBrowser* pWebBrowser; - eWebBrowserMouseButton mouseButton; - - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pWebBrowser); - argStream.ReadEnumString(mouseButton); - - if (!argStream.HasErrors()) - { - pWebBrowser->InjectMouseUp(mouseButton); - lua_pushboolean(luaVM, true); - return 1; - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushboolean(luaVM, false); - return 1; + browser->InjectMouseUp(mouseButton); + return true; } -int CLuaBrowserDefs::InjectBrowserMouseWheel(lua_State* luaVM) +bool CLuaBrowserDefs::InjectBrowserMouseWheel(CClientWebBrowser* browser, int scrollVert, int scrollHorz) { // bool injectMouseWheel ( browser webBrowser, int scrollVertical, int scrollHorizontal ) - CClientWebBrowser* pWebBrowser; - int iScrollVert; - int iScrollHorz; - - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pWebBrowser); - argStream.ReadNumber(iScrollVert); - argStream.ReadNumber(iScrollHorz); - - if (!argStream.HasErrors()) - { - pWebBrowser->InjectMouseWheel(iScrollVert, iScrollHorz); - lua_pushboolean(luaVM, true); - return 1; - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushboolean(luaVM, false); - return 1; + browser->InjectMouseWheel(scrollVert, scrollHorz); + return true; } -int CLuaBrowserDefs::GetBrowserTitle(lua_State* luaVM) +std::string CLuaBrowserDefs::GetBrowserTitle(CClientWebBrowser* browser) { // string getBrowserPageTitle ( browser webBrowser ) - CClientWebBrowser* pWebBrowser; - - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pWebBrowser); - - if (!argStream.HasErrors()) - { - lua_pushstring(luaVM, pWebBrowser->GetTitle()); - return 1; - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushboolean(luaVM, false); - return 1; + return browser->GetTitle(); } -int CLuaBrowserDefs::GetBrowserURL(lua_State* luaVM) +std::string CLuaBrowserDefs::GetBrowserURL(CClientWebBrowser* browser) { // string getBrowserURL ( browser webBrowser ) - CClientWebBrowser* pWebBrowser; - - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pWebBrowser); - - if (!argStream.HasErrors()) - { - lua_pushstring(luaVM, pWebBrowser->GetURL()); - return 1; - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushboolean(luaVM, false); - return 1; + return browser->GetURL(); } -int CLuaBrowserDefs::SetBrowserRenderingPaused(lua_State* luaVM) +bool CLuaBrowserDefs::SetBrowserRenderingPaused(CClientWebBrowser* browser, bool paused) { // bool setBrowserRenderingPaused ( browser webBrowser, bool paused ) - CClientWebBrowser* pWebBrowser; - bool bPaused; - - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pWebBrowser); - argStream.ReadBool(bPaused); - - if (!argStream.HasErrors()) - { - pWebBrowser->SetRenderingPaused(bPaused); - lua_pushboolean(luaVM, true); - return 1; - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushboolean(luaVM, false); - return 1; + browser->SetRenderingPaused(paused); + return true; } bool CLuaBrowserDefs::IsBrowserRenderingPaused(CClientWebBrowser* browser) @@ -482,628 +289,307 @@ bool CLuaBrowserDefs::IsBrowserRenderingPaused(CClientWebBrowser* browser) return browser->GetRenderingPaused(); } -int CLuaBrowserDefs::ExecuteBrowserJavascript(lua_State* luaVM) +bool CLuaBrowserDefs::ExecuteBrowserJavascript(CClientWebBrowser* browser, const std::string javascriptCode) { // bool executeBrowserJavascript ( browser webBrowser, string jsCode ) - CClientWebBrowser* pWebBrowser; - SString strJavascriptCode; + if (javascriptCode.empty() || browser->ExecuteJavascript(javascriptCode)) + return true; - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pWebBrowser); - argStream.ReadString(strJavascriptCode); - - if (!argStream.HasErrors()) - { - if (strJavascriptCode.empty() || pWebBrowser->ExecuteJavascript(strJavascriptCode)) - { - lua_pushboolean(luaVM, true); - return 1; - } - else - argStream.SetCustomError("This function does not work with remote browsers"); - } - - if (argStream.HasErrors()) - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushboolean(luaVM, false); - return 1; + throw std::invalid_argument("This function does not work with remote browsers"); } -int CLuaBrowserDefs::GetBrowserVolume(lua_State* luaVM) +float CLuaBrowserDefs::GetBrowserVolume(CClientWebBrowser* browser) { // float getBrowserVolume ( browser webBrowser ) - CClientWebBrowser* pWebBrowser; - - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pWebBrowser); - - if (!argStream.HasErrors()) - { - lua_pushnumber(luaVM, pWebBrowser->GetAudioVolume()); - return 1; - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushboolean(luaVM, false); - return 1; + return browser->GetAudioVolume(); } -int CLuaBrowserDefs::SetBrowserVolume(lua_State* luaVM) +bool CLuaBrowserDefs::SetBrowserVolume(std::variant webBrowserOrVolume, std::optional volume) { // bool setBrowserVolume ( float volume ) // bool setBrowserVolume ( browser webBrowser, float volume ) - CClientWebBrowser* pWebBrowser; - float fVolume; - - CScriptArgReader argStream(luaVM); - if (argStream.NextIsNumber()) + if (auto* volumeValue = std::get_if(&webBrowserOrVolume)) { - argStream.ReadNumber(fVolume); - auto pWebCore = g_pCore->GetWebCore(); - lua_pushboolean(luaVM, pWebCore ? pWebCore->SetGlobalAudioVolume(fVolume) : false); - return 1; + auto webCore = g_pCore->GetWebCore(); + return webCore ? webCore->SetGlobalAudioVolume(*volumeValue) : false; } - argStream.ReadUserData(pWebBrowser); - argStream.ReadNumber(fVolume); - - if (!argStream.HasErrors()) - { - lua_pushboolean(luaVM, pWebBrowser->SetAudioVolume(fVolume)); - return 1; - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushboolean(luaVM, false); - return 1; + return (*std::get_if(&webBrowserOrVolume))->SetAudioVolume(volume.value_or(0.0f)); } -int CLuaBrowserDefs::IsBrowserDomainBlocked(lua_State* luaVM) +std::optional CLuaBrowserDefs::IsBrowserDomainBlocked(const std::string url, std::optional isURL) { // bool isBrowserDomainBlocked ( string domain, bool isURL ) - SString strURL; - bool bIsURL; + auto webCore = g_pCore->GetWebCore(); - CScriptArgReader argStream(luaVM); - argStream.ReadString(strURL); - argStream.ReadBool(bIsURL, false); + if (!webCore) + return std::nullopt; - if (!argStream.HasErrors()) - { - auto pWebCore = g_pCore->GetWebCore(); - if (!pWebCore) - { - lua_pushnil(luaVM); - return 1; - } + SString domain = url; - if (bIsURL) - strURL = pWebCore->GetDomainFromURL(strURL); + if (isURL.value_or(false)) + domain = webCore->GetDomainFromURL(domain); - if (!strURL.empty()) - { - lua_pushboolean(luaVM, pWebCore->GetDomainState(strURL) != eURLState::WEBPAGE_ALLOWED); - return 1; - } - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + if (!domain.empty()) + return webCore->GetDomainState(domain) != eURLState::WEBPAGE_ALLOWED; - lua_pushnil(luaVM); - return 1; + return std::nullopt; } -int CLuaBrowserDefs::FocusBrowser(lua_State* luaVM) +bool CLuaBrowserDefs::FocusBrowser(std::optional browser) { // focusBrowser ( browser webBrowser ) - CClientWebBrowser* pWebBrowser; - - CScriptArgReader argStream(luaVM); - if (argStream.NextIsNil() || argStream.NextIsNone()) + if (!browser.has_value()) { - auto pWebCore = g_pCore->GetWebCore(); - if (pWebCore) - pWebCore->SetFocusedWebView(NULL); - lua_pushboolean(luaVM, true); - return 1; - } - - argStream.ReadUserData(pWebBrowser); + auto webCore = g_pCore->GetWebCore(); + if (webCore) + webCore->SetFocusedWebView(nullptr); - if (!argStream.HasErrors()) - { - pWebBrowser->Focus(); - lua_pushboolean(luaVM, true); - return 1; + return true; } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; + browser.value()->Focus(); + return true; } -int CLuaBrowserDefs::IsBrowserFocused(lua_State* luaVM) +bool CLuaBrowserDefs::IsBrowserFocused(CClientWebBrowser* browser) { - // browser isBrowserFocused () - CClientWebBrowser* pWebBrowser; - - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pWebBrowser); - - if (!argStream.HasErrors()) - { - auto pWebCore = g_pCore->GetWebCore(); - CWebViewInterface* pWebView = pWebCore ? pWebCore->GetFocusedWebView() : nullptr; - lua_pushboolean(luaVM, pWebBrowser->GetWebView() == pWebView); - return 1; - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushnil(luaVM); - return 1; + // browser isBrowserFocused ( browser webBrowser ) + auto webCore = g_pCore->GetWebCore(); + CWebViewInterface* webView = webCore ? webCore->GetFocusedWebView() : nullptr; + return browser->GetWebView() == webView; } -int CLuaBrowserDefs::SetBrowserProperty(lua_State* luaVM) +bool CLuaBrowserDefs::SetBrowserProperty(CClientWebBrowser* browser, const std::string key, const std::string value) { // bool setBrowserProperty ( browser webBrowser, string key, string value ) - CClientWebBrowser* pWebBrowser; - SString strKey; - SString strValue; - - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pWebBrowser); - argStream.ReadString(strKey); - argStream.ReadString(strValue); - - if (!argStream.HasErrors()) - { - if (pWebBrowser->SetProperty(strKey, strValue)) - { - lua_pushboolean(luaVM, true); - return 1; - } - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushboolean(luaVM, false); - return 1; + return browser->SetProperty(key, value); } -int CLuaBrowserDefs::GetBrowserProperty(lua_State* luaVM) +std::optional CLuaBrowserDefs::GetBrowserProperty(CClientWebBrowser* browser, const std::string key) { // string getBrowserProperty ( browser webBrowser, string key ) - CClientWebBrowser* pWebBrowser; - SString strKey; - - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pWebBrowser); - argStream.ReadString(strKey); + SString value; + if (browser->GetProperty(key, value)) + return value; - if (!argStream.HasErrors()) - { - SString strValue; - if (pWebBrowser->GetProperty(strKey, strValue)) - { - lua_pushstring(luaVM, strValue); - return 1; - } - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushnil(luaVM); - return 1; + return std::nullopt; } -int CLuaBrowserDefs::GetBrowserSettings(lua_State* luaVM) +std::unordered_map CLuaBrowserDefs::GetBrowserSettings() { // table getBrowserSettings () - auto pWebCore = g_pCore->GetWebCore(); - - lua_createtable(luaVM, 0, 3); - - lua_pushstring(luaVM, "RemoteEnabled"); - lua_pushboolean(luaVM, pWebCore ? pWebCore->GetRemotePagesEnabled() : false); - lua_settable(luaVM, -3); - - lua_pushstring(luaVM, "RemoteJavascript"); - lua_pushboolean(luaVM, pWebCore ? pWebCore->GetRemoteJavascriptEnabled() : false); - lua_settable(luaVM, -3); + auto webCore = g_pCore->GetWebCore(); - lua_pushstring(luaVM, "PluginsEnabled"); - lua_pushboolean(luaVM, false); - lua_settable(luaVM, -3); + std::unordered_map settings{ + {"RemoteEnabled", webCore ? webCore->GetRemotePagesEnabled() : false}, + {"RemoteJavascript", webCore ? webCore->GetRemoteJavascriptEnabled() : false}, + {"PluginsEnabled", false}, + }; - return 1; + return settings; } -int CLuaBrowserDefs::GetBrowserSource(lua_State* luaVM) +bool CLuaBrowserDefs::GetBrowserSource(lua_State* luaVM, CClientWebBrowser* browser, CLuaFunctionRef callbackFunction) { - // bool getBrowserSource ( function callback ) - CClientWebBrowser* pWebBrowser; - CLuaFunctionRef callbackFunction; - - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pWebBrowser); - argStream.ReadFunction(callbackFunction); - argStream.ReadFunctionComplete(); + // bool getBrowserSource ( browser webBrowser, function callback ) + CLuaMain* luaMain = m_pLuaManager->GetVirtualMachine(luaVM); - if (!argStream.HasErrors()) + if (luaMain && VERIFY_FUNCTION(callbackFunction)) { - CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine(luaVM); - if (pLuaMain && VERIFY_FUNCTION(callbackFunction)) - { - pWebBrowser->GetSourceCode( - [callbackFunction, pLuaMain, pWebBrowser](const std::string& code) + browser->GetSourceCode( + [callbackFunction, luaMain, browser](const std::string& code) + { + /* + This function should not be called when the resource is about to stop as + stopping the resource destroys the browser element and thus cancels the + CefStringVisitor callback class (see CWebView::GetSourceCode::MyStringVisitor) + */ + if (VERIFY_FUNCTION(callbackFunction)) { - /* - This function should not be called when the resource is about to stop as - stopping the resource destroys the browser element and thus cancels the - CefStringVisitor callback class (see CWebView::GetSourceCode::MyStringVisitor) - */ - if (VERIFY_FUNCTION(callbackFunction)) - { - CLuaArguments arguments; - // TODO: Use SCharStringRef/direct string access instead of copying strings around - arguments.PushString(code); - arguments.PushElement(pWebBrowser); - arguments.Call(pLuaMain, callbackFunction); - } - }); - - lua_pushboolean(luaVM, true); - return 1; - } + CLuaArguments arguments; + // TODO: Use SCharStringRef/direct string access instead of copying strings around + arguments.PushString(code); + arguments.PushElement(browser); + arguments.Call(luaMain, callbackFunction); + } + }); + + return true; } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushboolean(luaVM, false); - return 1; + return false; } -int CLuaBrowserDefs::ToggleBrowserDevTools(lua_State* luaVM) +bool CLuaBrowserDefs::ToggleBrowserDevTools(CClientWebBrowser* browser, bool visible) { // bool toggleBrowserDevTools ( browser webBrowser, bool visible ) - CClientWebBrowser* pWebBrowser; - bool visible; - - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pWebBrowser); - argStream.ReadBool(visible); - - if (!argStream.HasErrors()) - { - auto pWebCore = g_pCore->GetWebCore(); - if (pWebCore && pWebCore->IsTestModeEnabled()) - { - lua_pushboolean(luaVM, pWebBrowser->ToggleDevTools(visible)); - return 1; - } - else - m_pScriptDebugging->LogCustom(luaVM, "toggleBrowserDevtools can only be used in development mode"); - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + auto webCore = g_pCore->GetWebCore(); + if (webCore && webCore->IsTestModeEnabled()) + return browser->ToggleDevTools(visible); - lua_pushboolean(luaVM, false); - return 1; + throw std::invalid_argument("toggleBrowserDevtools can only be used in development mode"); } -int CLuaBrowserDefs::ResizeBrowser(lua_State* luaVM) +bool CLuaBrowserDefs::ResizeBrowser(CClientWebBrowser* browser, CVector2D size) { // bool resizeBrowser(browser webBrowser, float width, float height) - CClientWebBrowser* pWebBrowser; - CVector2D size; - - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pWebBrowser); - argStream.ReadVector2D(size); - - if (!argStream.HasErrors()) - { - pWebBrowser->Resize(size); - lua_pushboolean(luaVM, true); - return 1; - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushboolean(luaVM, false); - return 1; + browser->Resize(size); + return true; } -int CLuaBrowserDefs::CanBrowserNavigateBack(lua_State* luaVM) +bool CLuaBrowserDefs::CanBrowserNavigateBack(CClientWebBrowser* browser) { // bool canBrowserNavigateBack( browser webBrowser ) - CClientWebBrowser* pWebBrowser; - - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pWebBrowser); - - if (!argStream.HasErrors()) - { - lua_pushboolean(luaVM, pWebBrowser->CanGoBack()); - return 1; - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - - lua_pushnil(luaVM); - return 1; + return browser->CanGoBack(); } -int CLuaBrowserDefs::CanBrowserNavigateForward(lua_State* luaVM) +bool CLuaBrowserDefs::CanBrowserNavigateForward(CClientWebBrowser* browser) { // bool canBrowserNavigateForward( browser webBrowser ) - CClientWebBrowser* pWebBrowser; + return browser->CanGoForward(); +} - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pWebBrowser); +bool CLuaBrowserDefs::NavigateBrowserBack(CClientWebBrowser* browser) +{ + // bool navigateBrowserBack( browser webBrowser ) + return browser->GoBack(); +} - if (!argStream.HasErrors()) - { - lua_pushboolean(luaVM, pWebBrowser->CanGoForward()); - return 1; - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); +bool CLuaBrowserDefs::NavigateBrowserForward(CClientWebBrowser* browser) +{ + // bool navigateBrowserForward( browser webBrowser ) + return browser->GoForward(); +} - lua_pushnil(luaVM); - return 1; +bool CLuaBrowserDefs::ReloadBrowserPage(CClientWebBrowser* browser, std::optional ignoreCache) +{ + // bool reloadBrowserPage( browser webBrowser [, bool ignoreCache = false] ) + browser->Refresh(ignoreCache.value_or(false)); + return true; } -int CLuaBrowserDefs::NavigateBrowserBack(lua_State* luaVM) +std::variant CLuaBrowserDefs::GUICreateBrowser(lua_State* luaVM, CVector2D position, CVector2D size, bool isLocal, bool isTransparent, + std::optional relative, std::optional parent) { - // bool navigateBrowserBack( browser webBrowser ) - CClientWebBrowser* pWebBrowser; + // element guiCreateBrowser ( float x, float y, float width, float height, bool isLocal, bool isTransparent, bool relative, [element parent = nil] ) + if (size.fX < 0) + throw std::invalid_argument("Browser width is smaller than 0"); + else if (size.fY < 0) + throw std::invalid_argument("Browser height is smaller than 0"); + else if (size.fX == 0 || size.fY == 0) + throw std::invalid_argument("A browser must be at least 1x1 in size."); - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pWebBrowser); + auto webCore = g_pCore->GetWebCore(); + if (!isLocal && (!webCore || !webCore->GetRemotePagesEnabled())) + return false; - if (!argStream.HasErrors()) - { - lua_pushboolean(luaVM, pWebBrowser->GoBack()); - return 1; - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + CLuaMain* luaMain = m_pLuaManager->GetVirtualMachine(luaVM); + if (!luaMain) + return false; - lua_pushnil(luaVM); - return 1; -} + CGUI* gui = g_pCore->GetGUI(); -int CLuaBrowserDefs::NavigateBrowserForward(lua_State* luaVM) -{ - // bool navigateBrowserForward( browser webBrowser ) - CClientWebBrowser* pWebBrowser; + CGUIWebBrowser* webBrowser = gui->CreateWebBrowser(parent.has_value() ? (*parent)->GetCGUIElement() : gui->GetScriptRoot()); + webBrowser->SetPosition(position, relative.value_or(false)); + webBrowser->SetSize(size, relative.value_or(false)); - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pWebBrowser); + // Register to the gui manager + CVector2D absoluteSize; + webBrowser->GetSize(absoluteSize, false); + auto guiBrowser = new CClientGUIWebBrowser(isLocal, isTransparent, static_cast(absoluteSize.fX), static_cast(absoluteSize.fY), m_pManager, + luaMain, webBrowser); - if (!argStream.HasErrors()) + if (!guiBrowser->GetBrowser()) { - lua_pushboolean(luaVM, pWebBrowser->GoForward()); - return 1; + delete guiBrowser; + return false; } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - lua_pushnil(luaVM); - return 1; -} + guiBrowser->SetParent(parent.has_value() ? *parent : luaMain->GetResource()->GetResourceGUIEntity()); -int CLuaBrowserDefs::ReloadBrowserPage(lua_State* luaVM) -{ - // bool reloadBrowserPage( browser webBrowser ) - CClientWebBrowser* pWebBrowser; - bool bIgnoreCache; + // Load CEGUI element texture from webview + webBrowser->LoadFromWebView(guiBrowser->GetBrowser()->GetWebView()); - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pWebBrowser); - argStream.ReadIfNextIsBool(bIgnoreCache, false); + if (parent.has_value() && !(*parent)->IsCallPropagationEnabled()) + guiBrowser->GetCGUIElement()->SetInheritsAlpha(false); - if (!argStream.HasErrors()) - { - pWebBrowser->Refresh(bIgnoreCache); - lua_pushboolean(luaVM, true); - return 1; - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + return guiBrowser; +} - lua_pushnil(luaVM); - return 1; +std::variant CLuaBrowserDefs::GUIGetBrowser(CClientGUIElement* guiElement) // Or rather guiGetBrowserBrowser? +{ + // webbrowser guiGetBrowser ( gui-webbrowser browser ) + if (guiElement->GetCGUIType() == CGUI_WEBBROWSER) + return static_cast(guiElement)->GetBrowser(); + + return false; } -int CLuaBrowserDefs::GUICreateBrowser(lua_State* luaVM) +bool CLuaBrowserDefs::SetBrowserAjaxHandler(lua_State* luaVM, CClientWebBrowser* browser, const std::string url, + std::optional callbackFunction) { - // element guiCreateBrowser ( float x, float y, float width, float height, bool isLocal, bool isTransparent, bool relative, [element parent = nil] ) - CVector2D position; - CVector2D size; - bool bIsLocal; - bool bIsTransparent; - bool bIsRelative; - CClientGUIElement* parent; - - CScriptArgReader argStream(luaVM); - argStream.ReadVector2D(position); - argStream.ReadVector2D(size); - argStream.ReadBool(bIsLocal); - argStream.ReadBool(bIsTransparent); - argStream.ReadBool(bIsRelative, false); - argStream.ReadUserData(parent, nullptr); - - if (!argStream.HasErrors()) - { - if (size.fX < 0) - { - argStream.SetCustomError("Browser width is smaller than 0", "Invalid parameter"); - } - else if (size.fY < 0) - { - argStream.SetCustomError("Browser height is smaller than 0", "Invalid parameter"); - } - else if (size.fX == 0 || size.fY == 0) - { - argStream.SetCustomError("A browser must be at least 1x1 in size.", "Invalid parameter"); - } - } + // bool setBrowserAjaxHandler ( browser browser, string URL[, function callback] ) + if (!callbackFunction.has_value()) + return browser->RemoveAjaxHandler(url); - if (!argStream.HasErrors()) + CLuaMain* luaMain = m_pLuaManager->GetVirtualMachine(luaVM); + if (luaMain && VERIFY_FUNCTION(callbackFunction.value())) { - auto pWebCore = g_pCore->GetWebCore(); - if (!bIsLocal && (!pWebCore || !pWebCore->GetRemotePagesEnabled())) - { - lua_pushboolean(luaVM, false); - return 1; - } + CResource* resource = luaMain->GetResource(); + CResourceManager* resourceManager = m_pResourceManager; + auto netId = resource->GetNetID(); - CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine(luaVM); - if (pLuaMain) - { - CClientGUIElement* pGUIElement = - CStaticFunctionDefinitions::GUICreateBrowser(*pLuaMain, position, size, bIsLocal, bIsTransparent, bIsRelative, parent); + bool result = browser->AddAjaxHandler(url, + [=](std::vector& get, std::vector& post) -> const std::string + { + // Make sure the resource is still running + if (!resourceManager->Exists(resource) || resource->GetNetID() != netId) + { + return ""; + } - if (pGUIElement) - { - lua_pushelement(luaVM, pGUIElement); - return 1; - } - else - { - argStream.SetCustomError("Failed to create browser element", "Create browser"); - } - } - } + // Make sure the function is valid + if (VERIFY_FUNCTION(callbackFunction.value())) + { + CLuaArguments arguments; + CLuaArguments getArguments; + CLuaArguments postArguments; - if (argStream.HasErrors()) - return luaL_error(luaVM, argStream.GetFullErrorMessage()); + for (auto&& param : get) + getArguments.PushString(param); - lua_pushboolean(luaVM, false); - return 1; -} + for (auto&& param : post) + postArguments.PushString(param); -int CLuaBrowserDefs::GUIGetBrowser(lua_State* luaVM) // Or rather guiGetBrowserBrowser? -{ - // webbrowser guiGetBrowser ( gui-webbrowser browser ) - CClientGUIElement* pGUIElement; + arguments.PushTable(&getArguments); + arguments.PushTable(&postArguments); - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pGUIElement); + CLuaArguments result; - if (!argStream.HasErrors()) - { - if (IS_GUI(pGUIElement) && pGUIElement->GetCGUIType() == CGUI_WEBBROWSER) - { - CClientGUIWebBrowser* pGUIBrowser = static_cast(pGUIElement); - lua_pushelement(luaVM, pGUIBrowser->GetBrowser()); - return 1; - } - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + arguments.Call(luaMain, callbackFunction.value(), &result); - lua_pushboolean(luaVM, false); - return 1; -} - -int CLuaBrowserDefs::SetBrowserAjaxHandler(lua_State* luaVM) -{ - // bool setBrowserAjaxHandler ( browser browser, string URL[, function callback] ) - CClientWebBrowser* pWebBrowser; - SString strURL; - CLuaFunctionRef callbackFunction; + if (result.IsEmpty()) + return ""; - CScriptArgReader argStream(luaVM); - argStream.ReadUserData(pWebBrowser); - argStream.ReadString(strURL); + CLuaArgument* returnedValue = *result.begin(); + if (returnedValue->GetType() == LUA_TSTRING) + return std::string(returnedValue->GetString()); + else + return ""; + } + else + return ""; + }); - if (argStream.NextIsNil() || argStream.NextIsNone()) - { - if (!argStream.HasErrors()) - { - lua_pushboolean(luaVM, pWebBrowser->RemoveAjaxHandler(strURL)); - return 1; - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); - } - else - { - argStream.ReadFunction(callbackFunction); - argStream.ReadFunctionComplete(); - if (!argStream.HasErrors()) - { - CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine(luaVM); - if (pLuaMain && VERIFY_FUNCTION(callbackFunction)) - { - CResource* pResource = pLuaMain->GetResource(); - CResourceManager* pResourceManager = m_pResourceManager; - auto netId = pResource->GetNetID(); - - bool bResult = pWebBrowser->AddAjaxHandler(strURL, - [=](std::vector& vecGet, std::vector& vecPost) -> const std::string - { - // Make sure the resource is still running - if (!pResourceManager->Exists(pResource) || pResource->GetNetID() != netId) - { - return ""; - } - - // Make sure the function is valid - if (VERIFY_FUNCTION(callbackFunction)) - { - CLuaArguments arguments; - CLuaArguments getArguments; - CLuaArguments postArguments; - - for (auto&& param : vecGet) - getArguments.PushString(param); - - for (auto&& param : vecPost) - postArguments.PushString(param); - - arguments.PushTable(&getArguments); - arguments.PushTable(&postArguments); - - CLuaArguments result; - - arguments.Call(pLuaMain, callbackFunction, &result); - - if (result.IsEmpty()) - return ""; - - CLuaArgument* returnedValue = *result.begin(); - if (returnedValue->GetType() == LUA_TSTRING) - return std::string(returnedValue->GetString()); - else - return ""; - } - else - return ""; - }); - - lua_pushboolean(luaVM, bResult); - return 1; - } - } - else - m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); + return result; } - lua_pushboolean(luaVM, false); - return 1; + return false; } bool CLuaBrowserDefs::IsBrowserGPUEnabled() noexcept { - auto pWebCore = g_pCore->GetWebCore(); - return pWebCore ? pWebCore->GetGPUEnabled() : false; + auto webCore = g_pCore->GetWebCore(); + return webCore ? webCore->GetGPUEnabled() : false; } diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaBrowserDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaBrowserDefs.h index 0d214954ad..c5ab61ec10 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaBrowserDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaBrowserDefs.h @@ -11,6 +11,7 @@ #pragma once #include "CLuaDefs.h" +#include class CLuaBrowserDefs : public CLuaDefs { @@ -18,38 +19,39 @@ class CLuaBrowserDefs : public CLuaDefs static void LoadFunctions(); static void AddClass(lua_State* luaVM); - LUA_DECLARE(CreateBrowser); - LUA_DECLARE(IsBrowserSupported); - LUA_DECLARE(RequestBrowserDomains); - LUA_DECLARE(LoadBrowserURL); - LUA_DECLARE(IsBrowserLoading); - LUA_DECLARE(InjectBrowserMouseMove); - LUA_DECLARE(InjectBrowserMouseDown); - LUA_DECLARE(InjectBrowserMouseUp); - LUA_DECLARE(InjectBrowserMouseWheel); - LUA_DECLARE(GetBrowserTitle); - LUA_DECLARE(GetBrowserURL); - LUA_DECLARE(SetBrowserRenderingPaused); - static bool IsBrowserRenderingPaused(CClientWebBrowser* browser); - LUA_DECLARE(ExecuteBrowserJavascript); - LUA_DECLARE(GetBrowserVolume); - LUA_DECLARE(SetBrowserVolume); - LUA_DECLARE(IsBrowserDomainBlocked); - LUA_DECLARE(FocusBrowser); - LUA_DECLARE(IsBrowserFocused); - LUA_DECLARE(SetBrowserProperty); - LUA_DECLARE(GetBrowserProperty); - LUA_DECLARE(GetBrowserSettings); - LUA_DECLARE(GetBrowserSource); - LUA_DECLARE(SetBrowserAjaxHandler); - LUA_DECLARE(CanBrowserNavigateBack); - LUA_DECLARE(CanBrowserNavigateForward); - LUA_DECLARE(NavigateBrowserForward); - LUA_DECLARE(NavigateBrowserBack); - LUA_DECLARE(ReloadBrowserPage); - LUA_DECLARE(ToggleBrowserDevTools); - LUA_DECLARE(ResizeBrowser); - LUA_DECLARE(GUICreateBrowser); - LUA_DECLARE(GUIGetBrowser); - static bool IsBrowserGPUEnabled() noexcept; + static std::variant CreateBrowser(lua_State* luaVM, CVector2D size, bool isLocal, std::optional transparent); + static bool RequestBrowserDomains(lua_State* luaVM, std::vector pages, std::optional isURL, + std::optional callbackFunction); + static bool LoadBrowserURL(CClientWebBrowser* browser, const std::string url, std::optional postData, std::optional urlEncoded); + static bool IsBrowserLoading(CClientWebBrowser* browser); + static bool InjectBrowserMouseMove(CClientWebBrowser* browser, CVector2D position); + static bool InjectBrowserMouseDown(CClientWebBrowser* browser, eWebBrowserMouseButton mouseButton, std::optional doubleClick); + static bool InjectBrowserMouseUp(CClientWebBrowser* browser, eWebBrowserMouseButton mouseButton); + static bool InjectBrowserMouseWheel(CClientWebBrowser* browser, int scrollVert, int scrollHorz); + static std::string GetBrowserTitle(CClientWebBrowser* browser); + static std::string GetBrowserURL(CClientWebBrowser* browser); + static bool SetBrowserRenderingPaused(CClientWebBrowser* browser, bool paused); + static bool IsBrowserRenderingPaused(CClientWebBrowser* browser); + static bool ExecuteBrowserJavascript(CClientWebBrowser* browser, const std::string javascriptCode); + static float GetBrowserVolume(CClientWebBrowser* browser); + static bool SetBrowserVolume(std::variant webBrowserOrVolume, std::optional volume); + static std::optional IsBrowserDomainBlocked(const std::string url, std::optional isURL); + static bool FocusBrowser(std::optional browser); + static bool IsBrowserFocused(CClientWebBrowser* browser); + static bool SetBrowserProperty(CClientWebBrowser* browser, const std::string key, const std::string value); + static std::optional GetBrowserProperty(CClientWebBrowser* browser, const std::string key); + static std::unordered_map GetBrowserSettings(); + static bool GetBrowserSource(lua_State* luaVM, CClientWebBrowser* browser, CLuaFunctionRef callbackFunction); + static bool SetBrowserAjaxHandler(lua_State* luaVM, CClientWebBrowser* browser, const std::string url, std::optional callbackFunction); + static bool CanBrowserNavigateBack(CClientWebBrowser* browser); + static bool CanBrowserNavigateForward(CClientWebBrowser* browser); + static bool NavigateBrowserBack(CClientWebBrowser* browser); + static bool NavigateBrowserForward(CClientWebBrowser* browser); + static bool ReloadBrowserPage(CClientWebBrowser* browser, std::optional ignoreCache); + static bool ToggleBrowserDevTools(CClientWebBrowser* browser, bool visible); + static bool ResizeBrowser(CClientWebBrowser* browser, CVector2D size); + static std::variant GUICreateBrowser(lua_State* luaVM, CVector2D position, CVector2D size, bool isLocal, bool isTransparent, + std::optional relative, std::optional parent); + static std::variant GUIGetBrowser(CClientGUIElement* guiElement); + static bool IsBrowserGPUEnabled() noexcept; };