Defer speed-dial web commands off the webview callback stack

This commit is contained in:
SoftFever
2026-07-17 22:06:37 +08:00
parent dda49a2b7b
commit 2614ef7d63
2 changed files with 21 additions and 0 deletions
+14
View File
@@ -55,6 +55,8 @@ SpeedDialWebDialog::SpeedDialWebDialog(wxWindow* parent)
}
}
SpeedDialWebDialog::~SpeedDialWebDialog() { m_alive->store(false, std::memory_order_release); }
void SpeedDialWebDialog::request_show()
{
if (IsShown()) {
@@ -77,6 +79,18 @@ void SpeedDialWebDialog::on_script_message(const nlohmann::json& payload)
if (handle_common_script_command(payload))
return;
// Defer command handling out of the webview script-message callback: GTK and macOS deliver
// it synchronously inside the native webview callback, and window work on that stack is the
// crash class fixed in b779a7bfed/f2ccbfc8b5 (see PluginsDialog::on_script_message).
// run_action puts a modal confirm on that stack, which is the same bug.
wxGetApp().CallAfter([this, alive = m_alive, payload]() {
if (alive->load(std::memory_order_acquire))
handle_web_command(payload);
});
}
void SpeedDialWebDialog::handle_web_command(const nlohmann::json& payload)
{
const std::string command = payload.value("command", "");
if (command == "request_actions") {
m_page_ready = true;
+7
View File
@@ -3,6 +3,8 @@
#include <slic3r/GUI/Widgets/WebViewHostDialog.hpp>
#include <nlohmann/json_fwd.hpp>
#include <atomic>
#include <memory>
#include <string>
namespace Slic3r { namespace GUI {
@@ -11,15 +13,20 @@ class SpeedDialWebDialog : public WebViewHostDialog
{
public:
explicit SpeedDialWebDialog(wxWindow* parent);
~SpeedDialWebDialog() override;
void request_show();
private:
void on_script_message(const nlohmann::json& payload) override;
void handle_web_command(const nlohmann::json& payload);
void resize_to_content(int height);
void run_action(const std::string& id, const std::string& title);
void send_actions();
bool m_page_ready{false};
// Guards the CallAfter in on_script_message across dialog destruction, same as
// PluginsDialog::m_alive (PluginsDialog.hpp:249).
std::shared_ptr<std::atomic<bool>> m_alive = std::make_shared<std::atomic<bool>>(true);
};
}}