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.
This commit is contained in:
Adam
2025-02-17 20:08:46 +00:00
parent ba43bfe0a0
commit 1720eb0758
2 changed files with 79 additions and 45 deletions

View File

@@ -158,7 +158,7 @@ CefRefPtr<CefRequestHandler> 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<CefResourceRequestHandler> Browser::Launcher::LaunchRuneliteJarNormal(CefRefPtr<CefRequest> request, std::string_view query) {
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::LaunchRs3Deb(CefRefPtr<CefRequest> request, CefRefPtr<CefBrowser>, std::string_view query) {
return this->LaunchRs3Deb(request, query);
}
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::LaunchRs3Exe(CefRefPtr<CefRequest> request, CefRefPtr<CefBrowser>, std::string_view query) {
return this->LaunchRs3Exe(request, query);
}
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::LaunchRs3App(CefRefPtr<CefRequest> request, CefRefPtr<CefBrowser>, std::string_view query) {
return this->LaunchRs3App(request, query);
}
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::LaunchOsrsExe(CefRefPtr<CefRequest> request, CefRefPtr<CefBrowser>, std::string_view query) {
return this->LaunchOsrsExe(request, query);
}
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::LaunchOsrsApp(CefRefPtr<CefRequest> request, CefRefPtr<CefBrowser>, std::string_view query) {
return this->LaunchOsrsApp(request, query);
}
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::LaunchHdosJar(CefRefPtr<CefRequest> request, CefRefPtr<CefBrowser>, std::string_view query) {
return this->LaunchHdosJar(request, query);
}
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::LaunchRuneliteJarNormal(CefRefPtr<CefRequest> request, CefRefPtr<CefBrowser> browser, std::string_view query) {
return this->LaunchRuneliteJar(request, query, false);
}
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::LaunchRuneliteJarConfigure(CefRefPtr<CefRequest> request, std::string_view query) {
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::LaunchRuneliteJarConfigure(CefRefPtr<CefRequest> request, CefRefPtr<CefBrowser> browser, std::string_view query) {
return this->LaunchRuneliteJar(request, query, true);
}
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::SaveConfig(CefRefPtr<CefRequest> request, std::string_view _) {
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::SaveConfig(CefRefPtr<CefRequest> request, CefRefPtr<CefBrowser> browser, std::string_view _) {
return SaveFileFromPost(request, this->config_path.c_str());
}
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::SaveCredentials(CefRefPtr<CefRequest> request, std::string_view _) {
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::SaveCredentials(CefRefPtr<CefRequest> request, CefRefPtr<CefBrowser> browser, std::string_view _) {
return SaveFileFromPost(request, this->creds_path.c_str());
}
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::OpenExternalUrl(CefRefPtr<CefRequest> request, std::string_view _) {
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::OpenExternalUrl(CefRefPtr<CefRequest> request, CefRefPtr<CefBrowser> browser, std::string_view _) {
CefRefPtr<CefPostData> post_data = request->GetPostData();
QSENDBADREQUESTIF(!post_data || post_data->GetElementCount() != 1);
CefPostData::ElementVector elements;
@@ -438,7 +462,7 @@ CefRefPtr<CefResourceRequestHandler> Browser::Launcher::OpenExternalUrl(CefRefPt
QSENDOK();
}
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::BrowseDirectory(CefRefPtr<CefRequest> request, std::string_view query) {
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::BrowseDirectory(CefRefPtr<CefRequest> request, CefRefPtr<CefBrowser> 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<CefResourceRequestHandler> Browser::Launcher::BrowseDirectory(CefRefPt
QSENDOK();
}
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::BrowseData(CefRefPtr<CefRequest> request, std::string_view query) {
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::BrowseData(CefRefPtr<CefRequest> request, CefRefPtr<CefBrowser> browser, std::string_view query) {
QSENDSYSTEMERRORIF(BrowseFile(this->data_dir));
QSENDOK();
}
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::JarFilePicker(CefRefPtr<CefRequest> request, std::string_view query) {
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::JarFilePicker(CefRefPtr<CefRequest> request, CefRefPtr<CefBrowser> browser, std::string_view query) {
return new FilePicker(browser, {".jar"});
}
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::JsonFilePicker(CefRefPtr<CefRequest> request, std::string_view query) {
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::JsonFilePicker(CefRefPtr<CefRequest> request, CefRefPtr<CefBrowser> browser, std::string_view query) {
return new FilePicker(browser, {".json"});
}
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::Close(CefRefPtr<CefRequest> request, std::string_view query) {
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::Close(CefRefPtr<CefRequest> request, CefRefPtr<CefBrowser> browser, std::string_view query) {
browser->GetHost()->CloseBrowser(false);
QSENDOK();
}
#if defined(BOLT_PLUGINS)
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::SavePluginConfig(CefRefPtr<CefRequest> request, std::string_view _) {
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::SavePluginConfig(CefRefPtr<CefRequest> request, CefRefPtr<CefBrowser> browser, std::string_view _) {
return SaveFileFromPost(request, this->plugin_config_path.c_str());
}
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::ListGameClients(CefRefPtr<CefRequest> request, std::string_view _) {
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::ListGameClients(CefRefPtr<CefRequest> request, CefRefPtr<CefBrowser> browser, std::string_view _) {
this->UpdateClientList(true);
QSENDOK();
}
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::ReadJsonFile(CefRefPtr<CefRequest> request, std::string_view query) {
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::ReadJsonFile(CefRefPtr<CefRequest> request, CefRefPtr<CefBrowser> 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<CefResourceRequestHandler> Browser::Launcher::ReadJsonFile(CefRefPtr<C
}
}
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::StartPlugin(CefRefPtr<CefRequest> request, std::string_view query) {
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::StartPlugin(CefRefPtr<CefRequest> request, CefRefPtr<CefBrowser> browser, std::string_view query) {
CefString id;
bool has_id = false;
CefString path;
@@ -530,7 +554,7 @@ CefRefPtr<CefResourceRequestHandler> Browser::Launcher::StartPlugin(CefRefPtr<Ce
QSENDOK();
}
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::StopPlugin(CefRefPtr<CefRequest> request, std::string_view query) {
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::StopPlugin(CefRefPtr<CefRequest> request, CefRefPtr<CefBrowser> browser, std::string_view query) {
uint64_t client;
bool has_client = false;
bool client_valid = false;
@@ -547,7 +571,7 @@ CefRefPtr<CefResourceRequestHandler> Browser::Launcher::StopPlugin(CefRefPtr<Cef
QSENDOK();
}
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::InstallPlugin(CefRefPtr<CefRequest> request, std::string_view query) {
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::InstallPlugin(CefRefPtr<CefRequest> request, CefRefPtr<CefBrowser> browser, std::string_view query) {
#if defined(HAS_LIBARCHIVE)
CefRefPtr<CefPostData> post_data = request->GetPostData();
QSENDBADREQUESTIF(!post_data || post_data->GetElementCount() != 1);
@@ -619,7 +643,7 @@ CefRefPtr<CefResourceRequestHandler> Browser::Launcher::InstallPlugin(CefRefPtr<
#endif
}
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::UninstallPlugin(CefRefPtr<CefRequest> request, std::string_view query) {
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::UninstallPlugin(CefRefPtr<CefRequest> request, CefRefPtr<CefBrowser> browser, std::string_view query) {
QSTRING id;
bool has_id = false;
bool delete_data_dir = false;
@@ -641,7 +665,7 @@ CefRefPtr<CefResourceRequestHandler> Browser::Launcher::UninstallPlugin(CefRefPt
QSENDOK();
}
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::BrowsePluginData(CefRefPtr<CefRequest> request, std::string_view query) {
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::BrowsePluginData(CefRefPtr<CefRequest> request, CefRefPtr<CefBrowser> 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<CefResourceRequestHandler> Browser::Launcher::BrowsePluginData(CefRefP
QSENDOK();
}
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::BrowsePluginConfig(CefRefPtr<CefRequest> request, std::string_view query) {
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::BrowsePluginConfig(CefRefPtr<CefRequest> request, CefRefPtr<CefBrowser> 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<CefResourceRequestHandler> Browser::Launcher::BrowsePluginConfig(CefRe
QSENDOK();
}
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::GetPluginDirJson(CefRefPtr<CefRequest> request, std::string_view query) {
CefRefPtr<CefResourceRequestHandler> Browser::Launcher::GetPluginDirJson(CefRefPtr<CefRequest> request, CefRefPtr<CefBrowser> browser, std::string_view query) {
QSTRING id;
bool has_id = false;
ParseQuery(query, [&](const std::string_view& key, const std::string_view& val) {

View File

@@ -41,9 +41,8 @@ namespace Browser {
void OnWindowBoundsChanged(CefRefPtr<CefWindow>, 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<CefResourceRequestHandler> LaunchRs3Deb(CefRefPtr<CefRequest>, std::string_view);
@@ -51,31 +50,42 @@ namespace Browser {
CefRefPtr<CefResourceRequestHandler> LaunchRs3App(CefRefPtr<CefRequest>, std::string_view);
CefRefPtr<CefResourceRequestHandler> LaunchOsrsExe(CefRefPtr<CefRequest>, std::string_view);
CefRefPtr<CefResourceRequestHandler> LaunchOsrsApp(CefRefPtr<CefRequest>, std::string_view);
CefRefPtr<CefResourceRequestHandler> LaunchRuneliteJarNormal(CefRefPtr<CefRequest>, std::string_view);
CefRefPtr<CefResourceRequestHandler> LaunchRuneliteJarConfigure(CefRefPtr<CefRequest>, std::string_view);
CefRefPtr<CefResourceRequestHandler> LaunchRuneliteJar(CefRefPtr<CefRequest>, std::string_view, bool configure);
CefRefPtr<CefResourceRequestHandler> LaunchHdosJar(CefRefPtr<CefRequest>, std::string_view);
CefRefPtr<CefResourceRequestHandler> LaunchRuneliteJar(CefRefPtr<CefRequest>, std::string_view, bool configure);
CefRefPtr<CefResourceRequestHandler> SaveConfig(CefRefPtr<CefRequest>, std::string_view);
CefRefPtr<CefResourceRequestHandler> SaveCredentials(CefRefPtr<CefRequest>, std::string_view);
CefRefPtr<CefResourceRequestHandler> OpenExternalUrl(CefRefPtr<CefRequest>, std::string_view);
CefRefPtr<CefResourceRequestHandler> BrowseDirectory(CefRefPtr<CefRequest>, std::string_view);
CefRefPtr<CefResourceRequestHandler> BrowseData(CefRefPtr<CefRequest>, std::string_view);
CefRefPtr<CefResourceRequestHandler> JarFilePicker(CefRefPtr<CefRequest>, std::string_view);
CefRefPtr<CefResourceRequestHandler> JsonFilePicker(CefRefPtr<CefRequest>, std::string_view);
CefRefPtr<CefResourceRequestHandler> Close(CefRefPtr<CefRequest>, 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<CefResourceRequestHandler> LaunchRs3Deb(CefRefPtr<CefRequest>, CefRefPtr<CefBrowser>, std::string_view);
CefRefPtr<CefResourceRequestHandler> LaunchRs3Exe(CefRefPtr<CefRequest>, CefRefPtr<CefBrowser>, std::string_view);
CefRefPtr<CefResourceRequestHandler> LaunchRs3App(CefRefPtr<CefRequest>, CefRefPtr<CefBrowser>, std::string_view);
CefRefPtr<CefResourceRequestHandler> LaunchOsrsExe(CefRefPtr<CefRequest>, CefRefPtr<CefBrowser>, std::string_view);
CefRefPtr<CefResourceRequestHandler> LaunchOsrsApp(CefRefPtr<CefRequest>, CefRefPtr<CefBrowser>, std::string_view);
CefRefPtr<CefResourceRequestHandler> LaunchHdosJar(CefRefPtr<CefRequest>, CefRefPtr<CefBrowser>, std::string_view);
CefRefPtr<CefResourceRequestHandler> LaunchRuneliteJarNormal(CefRefPtr<CefRequest>, CefRefPtr<CefBrowser>, std::string_view);
CefRefPtr<CefResourceRequestHandler> LaunchRuneliteJarConfigure(CefRefPtr<CefRequest>, CefRefPtr<CefBrowser>, std::string_view);
CefRefPtr<CefResourceRequestHandler> SaveConfig(CefRefPtr<CefRequest>, CefRefPtr<CefBrowser>, std::string_view);
CefRefPtr<CefResourceRequestHandler> SaveCredentials(CefRefPtr<CefRequest>, CefRefPtr<CefBrowser>, std::string_view);
CefRefPtr<CefResourceRequestHandler> OpenExternalUrl(CefRefPtr<CefRequest>, CefRefPtr<CefBrowser>, std::string_view);
CefRefPtr<CefResourceRequestHandler> BrowseDirectory(CefRefPtr<CefRequest>, CefRefPtr<CefBrowser>, std::string_view);
CefRefPtr<CefResourceRequestHandler> BrowseData(CefRefPtr<CefRequest>, CefRefPtr<CefBrowser>, std::string_view);
CefRefPtr<CefResourceRequestHandler> JarFilePicker(CefRefPtr<CefRequest>, CefRefPtr<CefBrowser>, std::string_view);
CefRefPtr<CefResourceRequestHandler> JsonFilePicker(CefRefPtr<CefRequest>, CefRefPtr<CefBrowser>, std::string_view);
CefRefPtr<CefResourceRequestHandler> Close(CefRefPtr<CefRequest>, CefRefPtr<CefBrowser>, std::string_view);
#if defined(BOLT_PLUGINS)
CefRefPtr<CefResourceRequestHandler> SavePluginConfig(CefRefPtr<CefRequest>, std::string_view);
CefRefPtr<CefResourceRequestHandler> ListGameClients(CefRefPtr<CefRequest>, std::string_view);
CefRefPtr<CefResourceRequestHandler> ReadJsonFile(CefRefPtr<CefRequest>, std::string_view);
CefRefPtr<CefResourceRequestHandler> StartPlugin(CefRefPtr<CefRequest>, std::string_view);
CefRefPtr<CefResourceRequestHandler> StopPlugin(CefRefPtr<CefRequest>, std::string_view);
CefRefPtr<CefResourceRequestHandler> InstallPlugin(CefRefPtr<CefRequest>, std::string_view);
CefRefPtr<CefResourceRequestHandler> UninstallPlugin(CefRefPtr<CefRequest>, std::string_view);
CefRefPtr<CefResourceRequestHandler> GetPluginDirJson(CefRefPtr<CefRequest>, std::string_view);
CefRefPtr<CefResourceRequestHandler> BrowsePluginData(CefRefPtr<CefRequest>, std::string_view);
CefRefPtr<CefResourceRequestHandler> BrowsePluginConfig(CefRefPtr<CefRequest>, std::string_view);
CefRefPtr<CefResourceRequestHandler> SavePluginConfig(CefRefPtr<CefRequest>, CefRefPtr<CefBrowser>, std::string_view);
CefRefPtr<CefResourceRequestHandler> ListGameClients(CefRefPtr<CefRequest>, CefRefPtr<CefBrowser>, std::string_view);
CefRefPtr<CefResourceRequestHandler> ReadJsonFile(CefRefPtr<CefRequest>, CefRefPtr<CefBrowser>, std::string_view);
CefRefPtr<CefResourceRequestHandler> StartPlugin(CefRefPtr<CefRequest>, CefRefPtr<CefBrowser>, std::string_view);
CefRefPtr<CefResourceRequestHandler> StopPlugin(CefRefPtr<CefRequest>, CefRefPtr<CefBrowser>, std::string_view);
CefRefPtr<CefResourceRequestHandler> InstallPlugin(CefRefPtr<CefRequest>, CefRefPtr<CefBrowser>, std::string_view);
CefRefPtr<CefResourceRequestHandler> UninstallPlugin(CefRefPtr<CefRequest>, CefRefPtr<CefBrowser>, std::string_view);
CefRefPtr<CefResourceRequestHandler> GetPluginDirJson(CefRefPtr<CefRequest>, CefRefPtr<CefBrowser>, std::string_view);
CefRefPtr<CefResourceRequestHandler> BrowsePluginData(CefRefPtr<CefRequest>, CefRefPtr<CefBrowser>, std::string_view);
CefRefPtr<CefResourceRequestHandler> BrowsePluginConfig(CefRefPtr<CefRequest>, CefRefPtr<CefBrowser>, std::string_view);
#endif
private: