mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-09-16 05:27:50 +00:00
Recreate web view from scratch as only URL fix seems not robust enough
This commit is contained in:
@@ -111,26 +111,14 @@ PrinterWebView::PrinterWebView(wxWindow *parent)
|
|||||||
wxBoxSizer* topsizer = new wxBoxSizer(wxVERTICAL);
|
wxBoxSizer* topsizer = new wxBoxSizer(wxVERTICAL);
|
||||||
|
|
||||||
// Create the webview
|
// Create the webview
|
||||||
m_browser = WebView::CreateWebView(this, "");
|
create_browser();
|
||||||
if (m_browser == nullptr) {
|
if (m_browser == nullptr)
|
||||||
wxLogError("Could not init m_browser");
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef __linux__
|
// A PrinterWebView built during a GUI rebuild (language switch) can come up
|
||||||
inject_vue_resize_workaround(m_browser);
|
// with a wedged WebView2 backend that silently drops every navigation. Flag
|
||||||
|
// it so we recreate the backend the first time the tab is opened.
|
||||||
auto cookiesPath = boost::filesystem::path(data_dir() + "/cache/cookies.db");
|
m_reset_on_show = wxGetApp().is_recreating_gui();
|
||||||
auto wv = static_cast<WebKitWebView*>(m_browser->GetNativeBackend());
|
|
||||||
auto wv_ctx = webkit_web_view_get_context(wv);
|
|
||||||
auto cookieManager = webkit_web_context_get_cookie_manager(wv_ctx);
|
|
||||||
webkit_cookie_manager_set_persistent_storage(cookieManager, cookiesPath.c_str(), WEBKIT_COOKIE_PERSISTENT_STORAGE_SQLITE);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
m_browser->Bind(wxEVT_WEBVIEW_ERROR, &PrinterWebView::OnError, this);
|
|
||||||
m_browser->Bind(wxEVT_WEBVIEW_LOADED, &PrinterWebView::OnLoaded, this);
|
|
||||||
m_browser->Bind(wxEVT_WEBVIEW_NEWWINDOW, &PrinterWebView::OnNewWindow, this);
|
|
||||||
m_browser->Bind(wxEVT_WEBVIEW_SCRIPT_MESSAGE_RECEIVED, &PrinterWebView::OnScriptMessage, this);
|
|
||||||
|
|
||||||
SetSizer(topsizer);
|
SetSizer(topsizer);
|
||||||
|
|
||||||
@@ -169,6 +157,52 @@ PrinterWebView::~PrinterWebView()
|
|||||||
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " End";
|
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " End";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PrinterWebView::create_browser()
|
||||||
|
{
|
||||||
|
m_browser = WebView::CreateWebView(this, "");
|
||||||
|
if (m_browser == nullptr) {
|
||||||
|
wxLogError("Could not init m_browser");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
|
inject_vue_resize_workaround(m_browser);
|
||||||
|
|
||||||
|
auto cookiesPath = boost::filesystem::path(data_dir() + "/cache/cookies.db");
|
||||||
|
auto wv = static_cast<WebKitWebView*>(m_browser->GetNativeBackend());
|
||||||
|
auto wv_ctx = webkit_web_view_get_context(wv);
|
||||||
|
auto cookieManager = webkit_web_context_get_cookie_manager(wv_ctx);
|
||||||
|
webkit_cookie_manager_set_persistent_storage(cookieManager, cookiesPath.c_str(), WEBKIT_COOKIE_PERSISTENT_STORAGE_SQLITE);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
m_browser->Bind(wxEVT_WEBVIEW_ERROR, &PrinterWebView::OnError, this);
|
||||||
|
m_browser->Bind(wxEVT_WEBVIEW_LOADED, &PrinterWebView::OnLoaded, this);
|
||||||
|
m_browser->Bind(wxEVT_WEBVIEW_NEWWINDOW, &PrinterWebView::OnNewWindow, this);
|
||||||
|
m_browser->Bind(wxEVT_WEBVIEW_SCRIPT_MESSAGE_RECEIVED, &PrinterWebView::OnScriptMessage, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PrinterWebView::reset_browser()
|
||||||
|
{
|
||||||
|
BOOST_LOG_TRIVIAL(info) << "DEVTAB reset_browser"; // TEMP diag
|
||||||
|
wxSizer* topsizer = GetSizer();
|
||||||
|
if (m_browser) {
|
||||||
|
if (topsizer)
|
||||||
|
topsizer->Detach(m_browser);
|
||||||
|
m_browser->Destroy();
|
||||||
|
m_browser = nullptr;
|
||||||
|
}
|
||||||
|
m_apikey_sent = false;
|
||||||
|
|
||||||
|
create_browser();
|
||||||
|
if (m_browser == nullptr)
|
||||||
|
return;
|
||||||
|
if (topsizer) {
|
||||||
|
topsizer->Add(m_browser, wxSizerFlags().Expand().Proportion(1));
|
||||||
|
Layout();
|
||||||
|
}
|
||||||
|
update_mode();
|
||||||
|
}
|
||||||
|
|
||||||
void PrinterWebView::load_url(wxString& url, wxString apikey)
|
void PrinterWebView::load_url(wxString& url, wxString apikey)
|
||||||
{
|
{
|
||||||
// this->Show();
|
// this->Show();
|
||||||
@@ -192,7 +226,13 @@ void PrinterWebView::load_url(wxString& url, wxString apikey)
|
|||||||
|
|
||||||
bool PrinterWebView::Show(bool show)
|
bool PrinterWebView::Show(bool show)
|
||||||
{
|
{
|
||||||
if (show && !m_url_deferred.empty()) {
|
// Recover from a wedged WebView2 backend created during a GUI rebuild by
|
||||||
|
// recreating the control the first time the tab is actually opened.
|
||||||
|
if (show && m_reset_on_show) {
|
||||||
|
m_reset_on_show = false;
|
||||||
|
reset_browser();
|
||||||
|
}
|
||||||
|
if (show && !m_url_deferred.empty() && m_browser) {
|
||||||
m_browser->LoadURL(m_url_deferred);
|
m_browser->LoadURL(m_url_deferred);
|
||||||
//ORCA: m_url_deferred will be cleared on load success
|
//ORCA: m_url_deferred will be cleared on load success
|
||||||
//m_url_deferred.clear();
|
//m_url_deferred.clear();
|
||||||
|
|||||||
@@ -55,6 +55,13 @@ private:
|
|||||||
friend class PrinterWebViewHandler;
|
friend class PrinterWebViewHandler;
|
||||||
|
|
||||||
void SendAPIKey();
|
void SendAPIKey();
|
||||||
|
// Create/configure the underlying wxWebView (m_browser) and bind its events.
|
||||||
|
void create_browser();
|
||||||
|
// Tear down and recreate m_browser from scratch. Used to recover from a
|
||||||
|
// wedged WebView2 backend after a recreate_GUI (language switch), where a
|
||||||
|
// control created while the previous frame's active webview is still alive
|
||||||
|
// silently ignores all navigations.
|
||||||
|
void reset_browser();
|
||||||
|
|
||||||
wxWebView* m_browser;
|
wxWebView* m_browser;
|
||||||
long m_zoomFactor;
|
long m_zoomFactor;
|
||||||
@@ -62,6 +69,10 @@ private:
|
|||||||
bool m_apikey_sent;
|
bool m_apikey_sent;
|
||||||
wxString m_url_deferred;
|
wxString m_url_deferred;
|
||||||
std::unique_ptr<PrinterWebViewHandler> m_handler;
|
std::unique_ptr<PrinterWebViewHandler> m_handler;
|
||||||
|
// When this view is constructed during a GUI rebuild, its WebView2 backend
|
||||||
|
// may come up wedged. Recreate it the first time the view is actually shown
|
||||||
|
// (by then the old frame is gone and creation is clean).
|
||||||
|
bool m_reset_on_show{false};
|
||||||
|
|
||||||
// DECLARE_EVENT_TABLE()
|
// DECLARE_EVENT_TABLE()
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user