OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
WebView Class Reference

#include </home/runner/work/OrcaSlicer/OrcaSlicer/src/slic3r/GUI/Widgets/WebView.hpp>

Static Public Member Functions

static wxWebView * CreateWebView (wxWindow *parent, wxString const &url)
static void LoadUrl (wxWebView *webView, wxString const &url)
static wxString RedactUrl (const wxString &url)
static bool RunScript (wxWebView *webView, wxString const &msg)
static void MarkScriptMessageHandlerAdded (wxWebView *webView)
static bool NeedsRecreateOnShow ()
static bool NeedsCompositingWorkaround ()
static bool SupportsForceSharedMemory ()
static void RecreateAll ()

Detailed Description

Member Function Documentation

◆ CreateWebView()

wxWebView * WebView::CreateWebView ( wxWindow * parent,
wxString const & url )
static
314{
315#if wxUSE_WEBVIEW_EDGE
316 // Check if a fixed version of edge is present in
317 // $executable_path/edge_fixed and use it
318 wxFileName edgeFixedDir(wxStandardPaths::Get().GetExecutablePath());
319 edgeFixedDir.SetFullName("");
320 edgeFixedDir.AppendDir("edge_fixed");
321 if (edgeFixedDir.DirExists()) {
322 wxWebViewEdge::MSWSetBrowserExecutableDir(edgeFixedDir.GetFullPath());
323 wxLogMessage("Using fixed edge version");
324 }
325#endif
326 auto url2 = url;
327#ifdef __WIN32__
328 url2.Replace("\\", "/");
329#endif
330 if (!url2.empty()) { url2 = wxURI(url2).BuildURI(); }
331 BOOST_LOG_TRIVIAL(trace) << __FUNCTION__ << ": " << url2.ToUTF8();
332
333#ifdef __WIN32__
334 wxWebView* webView = new WebViewEdge;
335#elif defined(__WXOSX__)
336 wxWebView* webView = new WebViewWebKit;
337#else
338 auto webView = wxWebView::New();
339#endif
340 if (webView) {
341 webView->SetBackgroundColour(StateColor::darkModeColorFor(*wxWHITE));
342
343 wxString language_code = Slic3r::GUI::wxGetApp().current_language_code().BeforeFirst('_');
344 language_code = language_code.ToStdString();
345#ifdef __WIN32__
346 webView->SetUserAgent(wxString::Format("Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
347 "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.52 BBL-Slicer/v%s (%s) BBL-Language/%s",
348 Slic3r::GUI::wxGetApp().get_bbl_client_version(), Slic3r::GUI::wxGetApp().dark_mode() ? "dark" : "light", language_code.mb_str()));
349 webView->Create(parent, wxID_ANY, url2, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE);
350 // We register the wxfs:// protocol for testing purposes
351 webView->RegisterHandler(wxSharedPtr<wxWebViewHandler>(new wxWebViewArchiveHandler("bbl")));
352 // And the memory: file system
353 webView->RegisterHandler(wxSharedPtr<wxWebViewHandler>(new wxWebViewFSHandler("memory")));
354#else
355 // With WKWebView handlers need to be registered before creation.
356 // On Linux (WebKit2GTK), URI schemes are registered globally and can only
357 // be registered once, so guard against multiple registrations.
358 static bool s_schemes_registered = false;
359 if (!s_schemes_registered) {
360 webView->RegisterHandler(wxSharedPtr<wxWebViewHandler>(new wxWebViewArchiveHandler("wxfs")));
361 webView->RegisterHandler(wxSharedPtr<wxWebViewHandler>(new wxWebViewFSHandler("memory")));
362 s_schemes_registered = true;
363 }
364 webView->Create(parent, wxID_ANY, url2, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE);
365#ifdef __linux__
366 webView->SetUserAgent(linux_user_agent());
367#else
368 webView->SetUserAgent(wxString::Format("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) BBL-Slicer/v%s (%s) BBL-Language/%s",
369 Slic3r::GUI::wxGetApp().get_bbl_client_version(), Slic3r::GUI::wxGetApp().dark_mode() ? "dark" : "light", language_code.mb_str()));
370#endif
371#endif
372#ifdef __WXMAC__
373 WKWebView * wkWebView = (WKWebView *) webView->GetNativeBackend();
375#endif
376 auto addScriptMessageHandler = [] (wxWebView *webView) {
377 // Skip if SendAPIKey() already registered "wx"; a duplicate add throws an
378 // uncatchable NSException on WKWebView, killing the app at startup.
379 WebViewRef *ref = webview_ref(webView);
380 if (ref && ref->m_script_handler_added)
381 return;
382 BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": begin to add script message handler for wx.";
383 Slic3r::GUI::wxGetApp().set_adding_script_handler(true);
384 if (!webView->AddScriptMessageHandler("wx"))
385 wxLogError("Could not add script message handler");
386 else if (ref)
387 ref->m_script_handler_added = true;
388 Slic3r::GUI::wxGetApp().set_adding_script_handler(false);
389 BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": finished add script message handler for wx.";
390 };
391#ifndef __WIN32__
392 webView->CallAfter([webView, addScriptMessageHandler] {
393#endif
394 if (Slic3r::GUI::wxGetApp().is_adding_script_handler()) {
395 g_delay_webviews.push_back(webView);
396 } else {
397 addScriptMessageHandler(webView);
398 while (!g_delay_webviews.empty()) {
399 auto views = std::move(g_delay_webviews);
400 for (const wxWeakRef<wxWebView>& wv : views)
401 if (wv)
402 addScriptMessageHandler(wv.get());
403 }
404 }
405#ifndef __WIN32__
406 });
407#endif
408 webView->EnableContextMenu(true);
409 } else {
410 BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": failed. Use fake web view.";
411 webView = new FakeWebView;
412 }
413 webView->SetRefData(new WebViewRef(webView));
414 g_webviews.push_back(webView);
415 return webView;
416}
static std::vector< wxWeakRef< wxWebView > > g_delay_webviews
Definition WebView.cpp:274
static WebViewRef * webview_ref(wxWebView *webView)
Definition WebView.cpp:291
static std::vector< wxWebView * > g_webviews
Definition WebView.cpp:271
static wxColour darkModeColorFor(wxColour const &color)
Definition StateColor.cpp:219
bool m_script_handler_added
Definition WebView.cpp:288
void WKWebView_setTransparentBackground(void *web)
Definition MacDarkMode.mm:98

References StateColor::darkModeColorFor(), g_delay_webviews, g_webviews, WebViewRef::m_script_handler_added, webview_ref(), and Slic3r::GUI::WKWebView_setTransparentBackground().

Referenced by Slic3r::GUI::GuideFrame::GuideFrame(), Slic3r::GUI::ModelMallDialog::ModelMallDialog(), Slic3r::GUI::PrinterCloudAuthDialog::PrinterCloudAuthDialog(), Slic3r::GUI::WebPanel::WebPanel(), Slic3r::GUI::ZUserLogin::ZUserLogin(), Slic3r::GUI::PrinterWebView::create_browser(), Slic3r::GUI::ProjectPanel::create_browser(), Slic3r::GUI::WebViewPanel::create_browser(), Slic3r::GUI::WebViewPanel::create_cloud_browser(), Slic3r::GUI::StatusBasePanel::create_monitoring_page(), Slic3r::GUI::WebViewHostDialog::create_webview(), Slic3r::GUI::MarkdownTip::CreateTipView(), Slic3r::GUI::PrivacyUpdateDialog::CreateTipView(), and Slic3r::GUI::UpdateVersionDialog::CreateTipView().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ LoadUrl()

void WebView::LoadUrl ( wxWebView * webView,
wxString const & url )
static
481{
482 auto url2 = url;
483#ifdef __WIN32__
484 url2.Replace("\\", "/");
485#endif
486 if (!url2.empty()) { url2 = wxURI(url2).BuildURI(); }
487 BOOST_LOG_TRIVIAL(trace) << __FUNCTION__ << RedactUrl(url2).ToUTF8();
488 webView->LoadURL(url2);
489}
static wxString RedactUrl(const wxString &url)
Definition WebView.cpp:474

References RedactUrl().

Referenced by Slic3r::GUI::ProjectPanel::create_browser(), Slic3r::GUI::WebViewPanel::create_browser(), Slic3r::GUI::ModelMallDialog::go_to_url(), Slic3r::GUI::GuideFrame::load_url(), and Slic3r::GUI::WebViewHostDialog::load_url().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ MarkScriptMessageHandlerAdded()

void WebView::MarkScriptMessageHandlerAdded ( wxWebView * webView)
static
419{
420 if (WebViewRef *ref = webview_ref(webView))
421 ref->m_script_handler_added = true;
422}

References webview_ref().

Referenced by Slic3r::GUI::PrinterWebView::SendAPIKey().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ NeedsCompositingWorkaround()

bool WebView::NeedsCompositingWorkaround ( )
static
436{
437#ifdef __linux__
438 const guint major = webkit_get_major_version();
439 const guint minor = webkit_get_minor_version();
440 return major < 2 || (major == 2 && minor < 42);
441#else
442 return false;
443#endif
444}

Referenced by Slic3r::CLI::run().

Here is the caller graph for this function:

◆ NeedsRecreateOnShow()

bool WebView::NeedsRecreateOnShow ( )
static
425{
426 const bool recreating = Slic3r::GUI::wxGetApp().is_recreating_gui();
427 BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": is_recreating_gui = " << recreating;
428#ifdef __WIN32__
429 return recreating;
430#else
431 return false;
432#endif
433}

Referenced by Slic3r::GUI::PrinterWebView::PrinterWebView(), Slic3r::GUI::ProjectPanel::ProjectPanel(), and Slic3r::GUI::WebViewPanel::WebViewPanel().

Here is the caller graph for this function:

◆ RecreateAll()

void WebView::RecreateAll ( )
static
527{
528 auto dark = Slic3r::GUI::wxGetApp().dark_mode();
529 wxString language_code = Slic3r::GUI::wxGetApp().current_language_code().BeforeFirst('_');
530 language_code = language_code.ToStdString();
531 for (auto webView : g_webviews) {
532#ifdef __linux__
533 webView->SetUserAgent(linux_user_agent());
534#else
535 webView->SetUserAgent(wxString::Format("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) BBL-Slicer/v%s (%s) BBL-Language/%s",
536 Slic3r::GUI::wxGetApp().get_bbl_client_version(), dark ? "dark" : "light", language_code.mb_str()));
537#endif
538 // A host-themed WebViewHostDialog re-themes in place (no reload). If it handles
539 // the event, skip the reload; legacy pages fall through and reload as before
540 // (their own dark.css swap re-themes them on reload).
541 wxCommandEvent evt(EVT_WEBVIEW_RECREATED);
542 evt.SetEventObject(webView);
543 if (!webView->GetEventHandler()->ProcessEvent(evt))
544 webView->Reload();
545 }
546}

References g_webviews.

Referenced by Slic3r::GUI::MainFrame::on_sys_color_changed().

Here is the caller graph for this function:

◆ RedactUrl()

wxString WebView::RedactUrl ( const wxString & url)
static
475{
476 const size_t cut = url.find_first_of(wxString("?#"));
477 return cut == wxString::npos ? url : url.Left(cut);
478}

Referenced by Slic3r::GUI::WebViewPanel::load_cloud_url(), LoadUrl(), Slic3r::GUI::WebViewPanel::OnNavigationComplete(), Slic3r::GUI::WebViewPanel::OnNavigationRequest(), Slic3r::GUI::WebViewPanel::OnNewWindow(), and Slic3r::GUI::open_cloud_url_externally().

Here is the caller graph for this function:

◆ RunScript()

bool WebView::RunScript ( wxWebView * webView,
wxString const & msg )
static
492{
493 if (Slic3r::GUI::wxGetApp().app_config->get("internal_developer_mode") == "true"
494 && javascript.find("studio_userlogin") == wxString::npos)
495 wxLogMessage("Running JavaScript:\n%s\n", javascript);
496
497 try {
498#ifdef __WIN32__
499 ICoreWebView2 * webView2 = (ICoreWebView2 *) webView->GetNativeBackend();
500 if (webView2 == nullptr)
501 return false;
502 return webView2->ExecuteScript(javascript, NULL) == 0;
503#elif defined __WXMAC__
504 WKWebView * wkWebView = (WKWebView *) webView->GetNativeBackend();
505 Slic3r::GUI::WKWebView_evaluateJavaScript(wkWebView, javascript, nullptr);
506 return true;
507#else
508 WebKitWebView *wkWebView = (WebKitWebView *) webView->GetNativeBackend();
509 webkit_web_view_run_javascript(
510 wkWebView, javascript.utf8_str(), NULL,
511 [](GObject *wkWebView, GAsyncResult *res, void *) {
512 GError * error = NULL;
513 auto result = webkit_web_view_run_javascript_finish((WebKitWebView*)wkWebView, res, &error);
514 if (!result)
515 g_error_free (error);
516 else
517 webkit_javascript_result_unref (result);
518 }, NULL);
519 return true;
520#endif
521 } catch (std::exception &) {
522 return false;
523 }
524}
void WKWebView_evaluateJavaScript(void *web, wxString const &script, void(*callback)(wxString const &))
Definition MacDarkMode.mm:88

References Slic3r::GUI::WKWebView_evaluateJavaScript().

Referenced by Slic3r::GUI::WebPanel::apply_theme(), Slic3r::GUI::WebPanel::post_to_page(), Slic3r::GUI::WebViewHostDialog::run_script(), Slic3r::GUI::GuideFrame::RunScript(), Slic3r::GUI::MarkdownTip::RunScript(), Slic3r::GUI::PrivacyUpdateDialog::RunScript(), Slic3r::GUI::ProjectPanel::RunScript(), Slic3r::GUI::UpdateVersionDialog::RunScript(), Slic3r::GUI::WebViewPanel::RunScript(), Slic3r::GUI::ZUserLogin::RunScript(), and Slic3r::GUI::anonymous_namespace{PrinterWebViewHandler.cpp}::ElegooPrinterWebViewHandler::send_ipc_message().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ SupportsForceSharedMemory()

bool WebView::SupportsForceSharedMemory ( )
static
447{
448#ifdef __linux__
449 const guint major = webkit_get_major_version();
450 const guint minor = webkit_get_minor_version();
451 return major > 2 || (major == 2 && minor >= 44);
452#else
453 return false;
454#endif
455}

Referenced by Slic3r::CLI::run().

Here is the caller graph for this function:

The documentation for this class was generated from the following files:
  • /home/runner/work/OrcaSlicer/OrcaSlicer/src/slic3r/GUI/Widgets/WebView.hpp
  • /home/runner/work/OrcaSlicer/OrcaSlicer/src/slic3r/GUI/Widgets/WebView.cpp