mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-09-28 11:21:30 +00:00
Restore Plugin HTML After a WebKit Reload
Plugin dialog content is injected with SetPage, so on the WebKit backends a reload (context menu, keyboard shortcut or location.reload()) re-fetches the SetPage base URL instead of the injected document, and the plugin UI is gone for good: load_plugin_content() returned early once m_content_loaded was set. On GTK and macOS, re-inject the plugin HTML when a main-frame load arrives after the initial swap. m_own_page_load marks the load caused by our own SetPage so it is not mistaken for a reload, and a post-load error is left alone, as it only ever means a failed subresource. MSW is left out: WebView2 reloads NavigateToString content from its own history entry, so the page already survives a reload there, and the backend reports in-document navigation (a page setting location.hash) as a load, which re-injection would turn into a page wipe.
This commit is contained in:
@@ -139,19 +139,32 @@ void PluginWebDialog::destroy_for_plugin(PluginWebDialog* dialog)
|
|||||||
|
|
||||||
void PluginWebDialog::on_bootstrap_event(wxWebViewEvent& event)
|
void PluginWebDialog::on_bootstrap_event(wxWebViewEvent& event)
|
||||||
{
|
{
|
||||||
// The first bootstrap load (or its error) triggers the swap to plugin HTML;
|
// The first bootstrap load (or its error) triggers the swap to plugin HTML.
|
||||||
// the resulting plugin-page load is ignored (guarded by m_content_loaded).
|
if (!m_content_loaded)
|
||||||
load_plugin_content();
|
load_plugin_content();
|
||||||
|
#ifndef __WXMSW__
|
||||||
|
// WebKit reloads the SetPage base URL rather than the injected page, so a later main-frame
|
||||||
|
// load that is not our own SetPage is a browser reload, and the plugin HTML has to be put
|
||||||
|
// back. A post-load error only ever means a failed subresource. WebView2 reloads SetPage
|
||||||
|
// content from its own history entry, and reports in-document navigation as a load, so
|
||||||
|
// MSW needs neither the re-injection nor a guard against it.
|
||||||
|
else if (event.GetEventType() == wxEVT_WEBVIEW_LOADED) {
|
||||||
|
if (m_own_page_load)
|
||||||
|
m_own_page_load = false;
|
||||||
|
else
|
||||||
|
load_plugin_content();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
event.Skip();
|
event.Skip();
|
||||||
}
|
}
|
||||||
|
|
||||||
void PluginWebDialog::load_plugin_content()
|
void PluginWebDialog::load_plugin_content()
|
||||||
{
|
{
|
||||||
if (m_content_loaded)
|
|
||||||
return;
|
|
||||||
m_content_loaded = true;
|
m_content_loaded = true;
|
||||||
if (wxWebView* wv = browser())
|
if (wxWebView* wv = browser()) {
|
||||||
|
m_own_page_load = true;
|
||||||
wv->SetPage(wxString::FromUTF8(m_html), web_base_url());
|
wv->SetPage(wxString::FromUTF8(m_html), web_base_url());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PluginWebDialog::on_script_message(const nlohmann::json& payload)
|
void PluginWebDialog::on_script_message(const nlohmann::json& payload)
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ private:
|
|||||||
|
|
||||||
std::string m_html;
|
std::string m_html;
|
||||||
bool m_content_loaded{false};
|
bool m_content_loaded{false};
|
||||||
|
bool m_own_page_load{false}; // a SetPage of the plugin HTML is in flight
|
||||||
bool m_open{true};
|
bool m_open{true};
|
||||||
bool m_close_fired{false};
|
bool m_close_fired{false};
|
||||||
std::optional<nlohmann::json> m_result;
|
std::optional<nlohmann::json> m_result;
|
||||||
|
|||||||
Reference in New Issue
Block a user