From 1720eb0758221d9cd79abddf613d7335ed05e032 Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 17 Feb 2025 20:08:46 +0000 Subject: [PATCH] window_launcher: redo 022bafb That commit introduced an issue (e.g. #115) where the internal '/close' API would always be interpreted as coming from the primary browser due to how the ROUTE macro expands. I blame C++ for not warning me. --- src/browser/window_launcher.cxx | 66 ++++++++++++++++++++++----------- src/browser/window_launcher.hxx | 58 +++++++++++++++++------------ 2 files changed, 79 insertions(+), 45 deletions(-) diff --git a/src/browser/window_launcher.cxx b/src/browser/window_launcher.cxx index f228b3e..8fa7a77 100644 --- a/src/browser/window_launcher.cxx +++ b/src/browser/window_launcher.cxx @@ -158,7 +158,7 @@ CefRefPtr Browser::Launcher::GetRequestHandler() { return this; } -#define ROUTE(API, FUNC) if (path == "/" API) { return this->FUNC(request, query); } +#define ROUTE(API, FUNC) if (path == "/" API) { return this->FUNC(request, browser, query); } #define ROUTEUNSUPPORTED(API) if (path == "/" API) { QSENDNOTSUPPORTED(); } #if defined(BOLT_PLUGINS) @@ -408,23 +408,47 @@ CefString Browser::Launcher::BuildURL() const { return url.str(); } -CefRefPtr Browser::Launcher::LaunchRuneliteJarNormal(CefRefPtr request, std::string_view query) { +CefRefPtr Browser::Launcher::LaunchRs3Deb(CefRefPtr request, CefRefPtr, std::string_view query) { + return this->LaunchRs3Deb(request, query); +} + +CefRefPtr Browser::Launcher::LaunchRs3Exe(CefRefPtr request, CefRefPtr, std::string_view query) { + return this->LaunchRs3Exe(request, query); +} + +CefRefPtr Browser::Launcher::LaunchRs3App(CefRefPtr request, CefRefPtr, std::string_view query) { + return this->LaunchRs3App(request, query); +} + +CefRefPtr Browser::Launcher::LaunchOsrsExe(CefRefPtr request, CefRefPtr, std::string_view query) { + return this->LaunchOsrsExe(request, query); +} + +CefRefPtr Browser::Launcher::LaunchOsrsApp(CefRefPtr request, CefRefPtr, std::string_view query) { + return this->LaunchOsrsApp(request, query); +} + +CefRefPtr Browser::Launcher::LaunchHdosJar(CefRefPtr request, CefRefPtr, std::string_view query) { + return this->LaunchHdosJar(request, query); +} + +CefRefPtr Browser::Launcher::LaunchRuneliteJarNormal(CefRefPtr request, CefRefPtr browser, std::string_view query) { return this->LaunchRuneliteJar(request, query, false); } -CefRefPtr Browser::Launcher::LaunchRuneliteJarConfigure(CefRefPtr request, std::string_view query) { +CefRefPtr Browser::Launcher::LaunchRuneliteJarConfigure(CefRefPtr request, CefRefPtr browser, std::string_view query) { return this->LaunchRuneliteJar(request, query, true); } -CefRefPtr Browser::Launcher::SaveConfig(CefRefPtr request, std::string_view _) { +CefRefPtr Browser::Launcher::SaveConfig(CefRefPtr request, CefRefPtr browser, std::string_view _) { return SaveFileFromPost(request, this->config_path.c_str()); } -CefRefPtr Browser::Launcher::SaveCredentials(CefRefPtr request, std::string_view _) { +CefRefPtr Browser::Launcher::SaveCredentials(CefRefPtr request, CefRefPtr browser, std::string_view _) { return SaveFileFromPost(request, this->creds_path.c_str()); } -CefRefPtr Browser::Launcher::OpenExternalUrl(CefRefPtr request, std::string_view _) { +CefRefPtr Browser::Launcher::OpenExternalUrl(CefRefPtr request, CefRefPtr browser, std::string_view _) { CefRefPtr post_data = request->GetPostData(); QSENDBADREQUESTIF(!post_data || post_data->GetElementCount() != 1); CefPostData::ElementVector elements; @@ -438,7 +462,7 @@ CefRefPtr Browser::Launcher::OpenExternalUrl(CefRefPt QSENDOK(); } -CefRefPtr Browser::Launcher::BrowseDirectory(CefRefPtr request, std::string_view query) { +CefRefPtr Browser::Launcher::BrowseDirectory(CefRefPtr request, CefRefPtr browser, std::string_view query) { QSTRING path; bool has_path = false; ParseQuery(query, [&](const std::string_view& key, const std::string_view& val) { @@ -450,36 +474,36 @@ CefRefPtr Browser::Launcher::BrowseDirectory(CefRefPt QSENDOK(); } -CefRefPtr Browser::Launcher::BrowseData(CefRefPtr request, std::string_view query) { +CefRefPtr Browser::Launcher::BrowseData(CefRefPtr request, CefRefPtr browser, std::string_view query) { QSENDSYSTEMERRORIF(BrowseFile(this->data_dir)); QSENDOK(); } -CefRefPtr Browser::Launcher::JarFilePicker(CefRefPtr request, std::string_view query) { +CefRefPtr Browser::Launcher::JarFilePicker(CefRefPtr request, CefRefPtr browser, std::string_view query) { return new FilePicker(browser, {".jar"}); } -CefRefPtr Browser::Launcher::JsonFilePicker(CefRefPtr request, std::string_view query) { +CefRefPtr Browser::Launcher::JsonFilePicker(CefRefPtr request, CefRefPtr browser, std::string_view query) { return new FilePicker(browser, {".json"}); } -CefRefPtr Browser::Launcher::Close(CefRefPtr request, std::string_view query) { +CefRefPtr Browser::Launcher::Close(CefRefPtr request, CefRefPtr browser, std::string_view query) { browser->GetHost()->CloseBrowser(false); QSENDOK(); } #if defined(BOLT_PLUGINS) -CefRefPtr Browser::Launcher::SavePluginConfig(CefRefPtr request, std::string_view _) { +CefRefPtr Browser::Launcher::SavePluginConfig(CefRefPtr request, CefRefPtr browser, std::string_view _) { return SaveFileFromPost(request, this->plugin_config_path.c_str()); } -CefRefPtr Browser::Launcher::ListGameClients(CefRefPtr request, std::string_view _) { +CefRefPtr Browser::Launcher::ListGameClients(CefRefPtr request, CefRefPtr browser, std::string_view _) { this->UpdateClientList(true); QSENDOK(); } -CefRefPtr Browser::Launcher::ReadJsonFile(CefRefPtr request, std::string_view query) { +CefRefPtr Browser::Launcher::ReadJsonFile(CefRefPtr request, CefRefPtr browser, std::string_view query) { QSTRING path; bool has_path = false; ParseQuery(query, [&](const std::string_view& key, const std::string_view& val) { @@ -498,7 +522,7 @@ CefRefPtr Browser::Launcher::ReadJsonFile(CefRefPtr Browser::Launcher::StartPlugin(CefRefPtr request, std::string_view query) { +CefRefPtr Browser::Launcher::StartPlugin(CefRefPtr request, CefRefPtr browser, std::string_view query) { CefString id; bool has_id = false; CefString path; @@ -530,7 +554,7 @@ CefRefPtr Browser::Launcher::StartPlugin(CefRefPtr Browser::Launcher::StopPlugin(CefRefPtr request, std::string_view query) { +CefRefPtr Browser::Launcher::StopPlugin(CefRefPtr request, CefRefPtr browser, std::string_view query) { uint64_t client; bool has_client = false; bool client_valid = false; @@ -547,7 +571,7 @@ CefRefPtr Browser::Launcher::StopPlugin(CefRefPtr Browser::Launcher::InstallPlugin(CefRefPtr request, std::string_view query) { +CefRefPtr Browser::Launcher::InstallPlugin(CefRefPtr request, CefRefPtr browser, std::string_view query) { #if defined(HAS_LIBARCHIVE) CefRefPtr post_data = request->GetPostData(); QSENDBADREQUESTIF(!post_data || post_data->GetElementCount() != 1); @@ -619,7 +643,7 @@ CefRefPtr Browser::Launcher::InstallPlugin(CefRefPtr< #endif } -CefRefPtr Browser::Launcher::UninstallPlugin(CefRefPtr request, std::string_view query) { +CefRefPtr Browser::Launcher::UninstallPlugin(CefRefPtr request, CefRefPtr browser, std::string_view query) { QSTRING id; bool has_id = false; bool delete_data_dir = false; @@ -641,7 +665,7 @@ CefRefPtr Browser::Launcher::UninstallPlugin(CefRefPt QSENDOK(); } -CefRefPtr Browser::Launcher::BrowsePluginData(CefRefPtr request, std::string_view query) { +CefRefPtr Browser::Launcher::BrowsePluginData(CefRefPtr request, CefRefPtr browser, std::string_view query) { QSTRING id; bool has_id = false; ParseQuery(query, [&](const std::string_view& key, const std::string_view& val) { @@ -655,7 +679,7 @@ CefRefPtr Browser::Launcher::BrowsePluginData(CefRefP QSENDOK(); } -CefRefPtr Browser::Launcher::BrowsePluginConfig(CefRefPtr request, std::string_view query) { +CefRefPtr Browser::Launcher::BrowsePluginConfig(CefRefPtr request, CefRefPtr browser, std::string_view query) { QSTRING id; bool has_id = false; ParseQuery(query, [&](const std::string_view& key, const std::string_view& val) { @@ -669,7 +693,7 @@ CefRefPtr Browser::Launcher::BrowsePluginConfig(CefRe QSENDOK(); } -CefRefPtr Browser::Launcher::GetPluginDirJson(CefRefPtr request, std::string_view query) { +CefRefPtr Browser::Launcher::GetPluginDirJson(CefRefPtr request, CefRefPtr browser, std::string_view query) { QSTRING id; bool has_id = false; ParseQuery(query, [&](const std::string_view& key, const std::string_view& val) { diff --git a/src/browser/window_launcher.hxx b/src/browser/window_launcher.hxx index 0c568eb..a0be3c6 100644 --- a/src/browser/window_launcher.hxx +++ b/src/browser/window_launcher.hxx @@ -41,9 +41,8 @@ namespace Browser { void OnWindowBoundsChanged(CefRefPtr, const CefRect&) override; - /* - Functions called by GetResourceRequestHandler. The result will be returned immediately and must not be null. - The request and URL query string are provided for parsing. + /* + Game launch functions implemented in os-specific files */ CefRefPtr LaunchRs3Deb(CefRefPtr, std::string_view); @@ -51,31 +50,42 @@ namespace Browser { CefRefPtr LaunchRs3App(CefRefPtr, std::string_view); CefRefPtr LaunchOsrsExe(CefRefPtr, std::string_view); CefRefPtr LaunchOsrsApp(CefRefPtr, std::string_view); - CefRefPtr LaunchRuneliteJarNormal(CefRefPtr, std::string_view); - CefRefPtr LaunchRuneliteJarConfigure(CefRefPtr, std::string_view); - CefRefPtr LaunchRuneliteJar(CefRefPtr, std::string_view, bool configure); CefRefPtr LaunchHdosJar(CefRefPtr, std::string_view); + CefRefPtr LaunchRuneliteJar(CefRefPtr, std::string_view, bool configure); - CefRefPtr SaveConfig(CefRefPtr, std::string_view); - CefRefPtr SaveCredentials(CefRefPtr, std::string_view); - CefRefPtr OpenExternalUrl(CefRefPtr, std::string_view); - CefRefPtr BrowseDirectory(CefRefPtr, std::string_view); - CefRefPtr BrowseData(CefRefPtr, std::string_view); - CefRefPtr JarFilePicker(CefRefPtr, std::string_view); - CefRefPtr JsonFilePicker(CefRefPtr, std::string_view); - CefRefPtr Close(CefRefPtr, std::string_view); + /* + Functions called by GetResourceRequestHandler. The result will be returned immediately and must not be null. + The request and URL query string are provided for parsing. + */ + + CefRefPtr LaunchRs3Deb(CefRefPtr, CefRefPtr, std::string_view); + CefRefPtr LaunchRs3Exe(CefRefPtr, CefRefPtr, std::string_view); + CefRefPtr LaunchRs3App(CefRefPtr, CefRefPtr, std::string_view); + CefRefPtr LaunchOsrsExe(CefRefPtr, CefRefPtr, std::string_view); + CefRefPtr LaunchOsrsApp(CefRefPtr, CefRefPtr, std::string_view); + CefRefPtr LaunchHdosJar(CefRefPtr, CefRefPtr, std::string_view); + CefRefPtr LaunchRuneliteJarNormal(CefRefPtr, CefRefPtr, std::string_view); + CefRefPtr LaunchRuneliteJarConfigure(CefRefPtr, CefRefPtr, std::string_view); + CefRefPtr SaveConfig(CefRefPtr, CefRefPtr, std::string_view); + CefRefPtr SaveCredentials(CefRefPtr, CefRefPtr, std::string_view); + CefRefPtr OpenExternalUrl(CefRefPtr, CefRefPtr, std::string_view); + CefRefPtr BrowseDirectory(CefRefPtr, CefRefPtr, std::string_view); + CefRefPtr BrowseData(CefRefPtr, CefRefPtr, std::string_view); + CefRefPtr JarFilePicker(CefRefPtr, CefRefPtr, std::string_view); + CefRefPtr JsonFilePicker(CefRefPtr, CefRefPtr, std::string_view); + CefRefPtr Close(CefRefPtr, CefRefPtr, std::string_view); #if defined(BOLT_PLUGINS) - CefRefPtr SavePluginConfig(CefRefPtr, std::string_view); - CefRefPtr ListGameClients(CefRefPtr, std::string_view); - CefRefPtr ReadJsonFile(CefRefPtr, std::string_view); - CefRefPtr StartPlugin(CefRefPtr, std::string_view); - CefRefPtr StopPlugin(CefRefPtr, std::string_view); - CefRefPtr InstallPlugin(CefRefPtr, std::string_view); - CefRefPtr UninstallPlugin(CefRefPtr, std::string_view); - CefRefPtr GetPluginDirJson(CefRefPtr, std::string_view); - CefRefPtr BrowsePluginData(CefRefPtr, std::string_view); - CefRefPtr BrowsePluginConfig(CefRefPtr, std::string_view); + CefRefPtr SavePluginConfig(CefRefPtr, CefRefPtr, std::string_view); + CefRefPtr ListGameClients(CefRefPtr, CefRefPtr, std::string_view); + CefRefPtr ReadJsonFile(CefRefPtr, CefRefPtr, std::string_view); + CefRefPtr StartPlugin(CefRefPtr, CefRefPtr, std::string_view); + CefRefPtr StopPlugin(CefRefPtr, CefRefPtr, std::string_view); + CefRefPtr InstallPlugin(CefRefPtr, CefRefPtr, std::string_view); + CefRefPtr UninstallPlugin(CefRefPtr, CefRefPtr, std::string_view); + CefRefPtr GetPluginDirJson(CefRefPtr, CefRefPtr, std::string_view); + CefRefPtr BrowsePluginData(CefRefPtr, CefRefPtr, std::string_view); + CefRefPtr BrowsePluginConfig(CefRefPtr, CefRefPtr, std::string_view); #endif private: