SPE-2515: Improved reload functionality

Fix of script message after error with credentials /api key

Reload improvements

additional webview checks

Reload webview on F5 for mac / linux

Rename button

Fix of loading error page
This commit is contained in:
David Kocik 2024-10-31 13:02:22 +01:00 committed by Lukas Matena
parent 9f42394629
commit 85094c5c19
15 changed files with 309 additions and 162 deletions

View File

@ -1,28 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Connection failed</title>
<style>
body {
display: flex;
align-items: center;
justify-content: center;
height: 100vh;
margin: 0;
}
.container {
text-align: center;
}
</style>
</head>
<body>
<div class="container">
<h1>Connection failed</h1>
<p>Something went wrong.</p>
<button style="margin-top: 20px; padding: 10px 20px; font-size: 16px;" onclick="window._prusaSlicer.postMessage(JSON.stringify({ action: 'RELOAD_HOME_PAGE' }))">Reload</button>
</div>
</body>
</html>

View File

@ -0,0 +1,106 @@
<!doctype html>
<html lang='en'>
<head>
<meta charset='UTF-8' />
<meta content='width=device-width, initial-scale=1.0' name='viewport' />
<title>Connect-Slicer integration</title>
<style>
body {
font-family: Arial, sans-serif;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
margin: 0;
background-color: #f6f6f6;
color: #333;
}
.reload-button {
display: inline-block;
padding: 12px 24px;
font-size: 16px;
color: black;
background-color: white;
border: 2px solid black;
border-radius: 5px;
cursor: pointer;
text-transform: uppercase;
font-weight: bold;
transition: background-color 0.3s ease, color 0.3s ease;
}
.reload-button:hover {
background-color: black;
color: white;
}
.reload-button:focus {
outline: none;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
}
</style>
</head>
<body>
<!-- This page is not served anywhere, only to be copy 'n' pasted into Slicer as a fallback loading screen. -->
<div id='loading-screen' style='width: 100%; height: 100%'>
<div style='position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); text-align: center'>
<p>
<svg style='width: 80px'
viewBox='-250 -250 500 500' xmlns='http://www.w3.org/2000/svg'>
<style type='text/css'>
.filament {
stroke: #FF0033;
}
.spool {
stroke: #231F20;
fill: none;
}
.filament line {
stroke-linecap: round;
}
</style>
<defs>
<pattern class='spool' height='100' id='hexagon' patternTransform='scale(0.875)' patternUnits='userSpaceOnUse'
viewBox='-0.866025 -1.5 1.73205 3'
width='57.735'
>
<polygon fill='none' points='0,1 0.866025,0.5 0.866025,-0.5 0,-1 -0.866025,-0.5 -0.866025,0.5'
stroke-width='0.34' />
<line stroke-width='0.34' x1='0' x2='0' y1='1' y2='1.5'></line>
<line stroke-width='0.34' x1='0' x2='0' y1='-1' y2='-1.5'></line>
</pattern>
</defs>
<g class='filament'>
<circle fill='none' r='145' stroke-width='130'>
<!-- <animate attributeName='r' dur='6s' repeatCount='indefinite' values='145;80;145' />-->
<!-- <animate attributeName='stroke-width' dur='6s' repeatCount='indefinite' values='130;0;130' />-->
</circle>
<line stroke-width='12' x1='204' x2='204' y1='0' y2='245'>
<!-- <animate attributeName='x1' dur='6s' repeatCount='indefinite' values='204;74;204' />-->
<!-- <animate attributeName='x2' dur='6s' repeatCount='indefinite' values='204;74;204' />-->
</line>
</g>
<g class='spool'>
<circle fill='none' r='157' stroke='url(#hexagon)' stroke-width='171' />
<circle r='244' stroke-width='12' />
<circle r='71' stroke-width='18' />
<!-- <animateTransform
attributeName='transform' begin='0s'
dur='6s'
fill='freeze'
repeatCount='indefinite'
type='rotate'
values='0;540;0'
/>-->
</g>
</svg>
</p>
<p style="font-size: 24px;">Something went wrong.</p>
<button class="reload-button" onclick="window._prusaSlicer.postMessage(JSON.stringify({ action: 'RELOAD_HOME_PAGE' }))">Reload</button>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,82 @@
<!doctype html>
<html lang='en'>
<head>
<meta charset='UTF-8' />
<meta content='width=device-width, initial-scale=1.0' name='viewport' />
<title>Connect-Slicer integration</title>
<style>
body {
font-family: Arial, sans-serif;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
margin: 0;
background-color: #f6f6f6;
color: #333;
}
</style>
</head>
<body>
<!-- This page is not served anywhere, only to be copy 'n' pasted into Slicer as a fallback loading screen. -->
<div id='loading-screen' style='width: 100%; height: 100%'>
<div style='position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); text-align: center'>
<p>
<svg style='width: 80px'
viewBox='-250 -250 500 500' xmlns='http://www.w3.org/2000/svg'>
<style type='text/css'>
.filament {
stroke: #FF0033;
}
.spool {
stroke: #231F20;
fill: none;
}
.filament line {
stroke-linecap: round;
}
</style>
<defs>
<pattern class='spool' height='100' id='hexagon' patternTransform='scale(0.875)' patternUnits='userSpaceOnUse'
viewBox='-0.866025 -1.5 1.73205 3'
width='57.735'
>
<polygon fill='none' points='0,1 0.866025,0.5 0.866025,-0.5 0,-1 -0.866025,-0.5 -0.866025,0.5'
stroke-width='0.34' />
<line stroke-width='0.34' x1='0' x2='0' y1='1' y2='1.5'></line>
<line stroke-width='0.34' x1='0' x2='0' y1='-1' y2='-1.5'></line>
</pattern>
</defs>
<g class='filament'>
<circle fill='none' r='145' stroke-width='130'>
<!-- <animate attributeName='r' dur='6s' repeatCount='indefinite' values='145;80;145' />-->
<!-- <animate attributeName='stroke-width' dur='6s' repeatCount='indefinite' values='130;0;130' />-->
</circle>
<line stroke-width='12' x1='204' x2='204' y1='0' y2='245'>
<!-- <animate attributeName='x1' dur='6s' repeatCount='indefinite' values='204;74;204' />-->
<!-- <animate attributeName='x2' dur='6s' repeatCount='indefinite' values='204;74;204' />-->
</line>
</g>
<g class='spool'>
<circle fill='none' r='157' stroke='url(#hexagon)' stroke-width='171' />
<circle r='244' stroke-width='12' />
<circle r='71' stroke-width='18' />
<!-- <animateTransform
attributeName='transform' begin='0s'
dur='6s'
fill='freeze'
repeatCount='indefinite'
type='rotate'
values='0;540;0'
/>-->
</g>
</svg>
</p>
<p style="font-size: 24px;">Something went wrong.</p>
</div>
</div>
</body>
</html>

View File

@ -4,6 +4,42 @@
<meta charset='UTF-8' />
<meta content='width=device-width, initial-scale=1.0' name='viewport' />
<title>Connect-Slicer integration</title>
<style>
body {
font-family: Arial, sans-serif;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
margin: 0;
background-color: #f6f6f6;
color: #333;
}
.reload-button {
display: inline-block;
padding: 12px 24px;
font-size: 16px;
color: black;
background-color: white;
border: 2px solid black;
border-radius: 5px;
cursor: pointer;
text-transform: uppercase;
font-weight: bold;
transition: background-color 0.3s ease, color 0.3s ease;
}
.reload-button:hover {
background-color: black;
color: white;
}
.reload-button:focus {
outline: none;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
}
</style>
</head>
<body>
<!-- This page is not served anywhere, only to be copy 'n' pasted into Slicer as a fallback loading screen. -->
@ -14,7 +50,7 @@
viewBox='-250 -250 500 500' xmlns='http://www.w3.org/2000/svg'>
<style type='text/css'>
.filament {
stroke: #FA6831;
stroke: #FF0033;
}
.spool {
@ -63,7 +99,7 @@
</svg>
</p>
<p style="font-size: 24px;">Something went wrong.</p>
<button style="margin-top: 20px; padding: 10px 20px; font-size: 16px;" onclick="window.ExternalApp.postMessage(JSON.stringify({ event: 'reloadHomePage' }))">Reload</button>
<button class="reload-button" onclick="window.ExternalApp.postMessage(JSON.stringify({ event: 'reloadHomePage' }))">Reload</button>
</div>
</div>
</body>

View File

@ -34,7 +34,7 @@ ConfigWizardWebViewPage::ConfigWizardWebViewPage(ConfigWizard *parent)
append(fail_text);
return;
}
WebView::webview_create(m_browser, this, p_user_account->generate_login_redirect_url(), {});
WebView::webview_create(m_browser, this, p_user_account->generate_login_redirect_url(), {"ExternalApp"});
if (logged) {
// TRN Config wizard page with a log in web.
@ -49,11 +49,13 @@ ConfigWizardWebViewPage::ConfigWizardWebViewPage(ConfigWizard *parent)
append(m_browser_sizer, 1, wxEXPAND);
m_browser_sizer->Show(!logged);
Layout();
// Connect the webview events
Bind(wxEVT_WEBVIEW_ERROR, &ConfigWizardWebViewPage::on_error, this, m_browser->GetId());
Bind(wxEVT_WEBVIEW_NAVIGATING, &ConfigWizardWebViewPage::on_navigation_request, this, m_browser->GetId());
Bind(wxEVT_IDLE, &ConfigWizardWebViewPage::on_idle, this);
Bind(wxEVT_WEBVIEW_SCRIPT_MESSAGE_RECEIVED, &ConfigWizardWebViewPage::on_script_message, this, m_browser->GetId());
}
bool ConfigWizardWebViewPage::login_changed()
@ -115,7 +117,7 @@ void ConfigWizardWebViewPage::on_idle(wxIdleEvent &WXUNUSED(evt)) {
if (!m_vetoed && m_load_error_page) {
m_load_error_page = false;
m_browser->LoadURL(GUI::format_wxstr(
"file://%1%/web/connection_failed.html",
"file://%1%/web/other_error.html",
boost::filesystem::path(resources_dir()).generic_string()
));
}
@ -147,4 +149,11 @@ void ConfigWizardWebViewPage::on_navigation_request(wxWebViewEvent &evt)
}
}
}
void ConfigWizardWebViewPage::on_script_message(wxWebViewEvent& evt)
{
// only reaload button on erro page
m_browser->LoadURL(p_user_account->generate_login_redirect_url());
}
}} // namespace Slic3r::GUI

View File

@ -53,6 +53,7 @@ public:
void on_error(wxWebViewEvent &evt);
void on_navigation_request(wxWebViewEvent &evt);
void on_idle(wxIdleEvent &evt);
void on_script_message(wxWebViewEvent& evt);
void load_error_page();
// returns true if logged in - wizard needs to update repos
bool login_changed();

View File

@ -919,14 +919,14 @@ void MainFrame::remove_printables_webview_tab()
void MainFrame::show_printer_webview_tab(DynamicPrintConfig* dpc)
{
remove_printer_webview_tab();
// if physical printer is selected
if (dpc && dpc->option<ConfigOptionEnum<PrintHostType>>("host_type")->value != htPrusaConnect) {
std::string url = dpc->opt_string("print_host");
if (url.find("http://") != 0 && url.find("https://") != 0) {
url = "http://" + url;
}
// set password / api key
if (dynamic_cast<const ConfigOptionEnum<AuthorizationType>*>(dpc->option("printhost_authorization_type"))->value == AuthorizationType::atKeyPassword) {
set_printer_webview_api_key(dpc->opt_string("printhost_apikey"));
@ -934,26 +934,14 @@ void MainFrame::show_printer_webview_tab(DynamicPrintConfig* dpc)
else {
set_printer_webview_credentials(dpc->opt_string("printhost_user"), dpc->opt_string("printhost_password"));
}
// add printer or change url
if (get_printer_webview_tab_added()) {
set_printer_webview_tab_url(from_u8(url));
}
else {
add_printer_webview_tab(from_u8(url));
}
}
// if physical printer isn't selected, so delete page from TopBar
else {
if (m_tabpanel->GetPageText(m_tabpanel->GetSelection()) == _L("Physical Printer"))
select_tab(size_t(0));
remove_printer_webview_tab();
add_printer_webview_tab(from_u8(url));
}
}
void MainFrame::add_printer_webview_tab(const wxString& url)
{
if (m_printer_webview_added) {
set_printer_webview_tab_url(url);
//set_printer_webview_tab_url(url);
return;
}
m_printer_webview_added = true;
@ -967,28 +955,13 @@ void MainFrame::remove_printer_webview_tab()
if (!m_printer_webview_added) {
return;
}
if (m_tabpanel->GetPageText(m_tabpanel->GetSelection()) == _L("Physical Printer"))
select_tab(size_t(0));
m_printer_webview_added = false;
m_printer_webview->Hide();
m_tabpanel->RemovePage(m_tabpanel->FindPage(m_printer_webview));
m_printer_webview->destroy_browser();
}
void MainFrame::set_printer_webview_tab_url(const wxString& url)
{
if (!m_printer_webview_added) {
add_printer_webview_tab(url);
return;
}
// TODO: this will reset already filled credential when bundle loaded,
// what's the reason of clearing credentials here?
//m_printer_webview->clear();
m_printer_webview->set_default_url(url);
if (m_tabpanel->GetSelection() == m_tabpanel->FindPage(m_printer_webview)) {
m_printer_webview->load_url(url);
} else {
m_printer_webview->load_default_url_delayed();
}
}
void MainFrame::set_printer_webview_api_key(const std::string& key)
{
@ -1726,7 +1699,7 @@ void MainFrame::init_menubar_as_editor()
#endif // __APPLE__
viewMenu->AppendSeparator();
append_menu_item(viewMenu, wxID_ANY, _L("&Reload WebView"), _L("Reload WebView"),
append_menu_item(viewMenu, wxID_ANY, _L("&Reload Web Content") + "\tF5", _L("Reload WebView"),
[this](wxCommandEvent&) { reload_selected_webview(); }, "", nullptr, [this]() {return is_any_webview_selected(); }, this);
}

View File

@ -234,7 +234,6 @@ public:
void add_printer_webview_tab(const wxString& url);
void remove_printer_webview_tab();
void set_printer_webview_tab_url(const wxString& url);
bool get_printer_webview_tab_added() const { return m_printer_webview_added; }
void set_printer_webview_api_key(const std::string& key);
void set_printer_webview_credentials(const std::string& usr, const std::string& psk);

View File

@ -21,44 +21,40 @@ wxWebView* WebView::webview_new()
wxWebView* webView = nullptr;
if (backend_available)
webView = wxWebView::New();
if (!webView)
BOOST_LOG_TRIVIAL(error) << "Failed to create wxWebView object.";
return webView;
}
void WebView::webview_create(wxWebView* webView, wxWindow *parent, const wxString& url, const std::vector<std::string>& message_handlers)
{
if (webView) {
wxString correct_url = url.empty() ? wxString("") : wxURI(url).BuildURI();
wxString user_agent = Slic3r::GUI::format_wxstr("%1%/%2% (%3%)",SLIC3R_APP_FULL_NAME, SLIC3R_VERSION, Slic3r::platform_to_string(Slic3r::platform()));
assert(webView);
wxString correct_url = url.empty() ? wxString("") : wxURI(url).BuildURI();
wxString user_agent = Slic3r::GUI::format_wxstr("%1%/%2% (%3%)",SLIC3R_APP_FULL_NAME, SLIC3R_VERSION, Slic3r::platform_to_string(Slic3r::platform()));
#ifdef __WIN32__
webView->SetUserAgent(user_agent);
webView->Create(parent, wxID_ANY, correct_url, wxDefaultPosition, wxDefaultSize);
//We register the wxfs:// protocol for testing purposes
//webView->RegisterHandler(wxSharedPtr<wxWebViewHandler>(new wxWebViewArchiveHandler("wxfs")));
//And the memory: file system
//webView->RegisterHandler(wxSharedPtr<wxWebViewHandler>(new wxWebViewFSHandler("memory")));
webView->SetUserAgent(user_agent);
webView->Create(parent, wxID_ANY, correct_url, wxDefaultPosition, wxDefaultSize);
//We register the wxfs:// protocol for testing purposes
//webView->RegisterHandler(wxSharedPtr<wxWebViewHandler>(new wxWebViewArchiveHandler("wxfs")));
//And the memory: file system
//webView->RegisterHandler(wxSharedPtr<wxWebViewHandler>(new wxWebViewFSHandler("memory")));
#else
// With WKWebView handlers need to be registered before creation
//webView->RegisterHandler(wxSharedPtr<wxWebViewHandler>(new wxWebViewArchiveHandler("wxfs")));
// And the memory: file system
//webView->RegisterHandler(wxSharedPtr<wxWebViewHandler>(new wxWebViewFSHandler("memory")));
webView->Create(parent, wxID_ANY, correct_url, wxDefaultPosition, wxDefaultSize);
webView->SetUserAgent(user_agent);
// With WKWebView handlers need to be registered before creation
//webView->RegisterHandler(wxSharedPtr<wxWebViewHandler>(new wxWebViewArchiveHandler("wxfs")));
// And the memory: file system
//webView->RegisterHandler(wxSharedPtr<wxWebViewHandler>(new wxWebViewFSHandler("memory")));
webView->Create(parent, wxID_ANY, correct_url, wxDefaultPosition, wxDefaultSize);
webView->SetUserAgent(user_agent);
#endif
#ifndef __WIN32__
Slic3r::GUI::wxGetApp().CallAfter([message_handlers, webView] {
Slic3r::GUI::wxGetApp().CallAfter([message_handlers, webView] {
#endif
for (const std::string& handler : message_handlers) {
if (!webView->AddScriptMessageHandler(Slic3r::GUI::into_u8(handler))) {
//wxLogError("Could not add script message handler");
BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << "Could not add script message handler " << handler;
}
for (const std::string& handler : message_handlers) {
if (!webView->AddScriptMessageHandler(Slic3r::GUI::from_u8(handler))) {
BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << "Could not add script message handler " << handler;
}
#ifndef __WIN32__
});
#endif
webView->EnableContextMenu(false);
} else {
// TODO: dialog to user !!!
BOOST_LOG_TRIVIAL(error) << "Failed to create wxWebView object.";
}
#ifndef __WIN32__
});
#endif
webView->EnableContextMenu(false);
}

View File

@ -30,7 +30,7 @@ namespace pt = boost::property_tree;
namespace Slic3r {
namespace GUI {
WebViewDialog::WebViewDialog(wxWindow* parent, const wxString& url, const wxString& dialog_name, const wxSize& size, const std::vector<std::string>& message_handler_names, const std::string& loading_html/* = "loading"*/)
WebViewDialog::WebViewDialog(wxWindow* parent, const wxString& url, const wxString& dialog_name, const wxSize& size, const std::vector<std::string>& message_handler_names, const std::string& loading_html/* = "other_loading"*/)
: DPIDialog(parent, wxID_ANY, dialog_name, wxDefaultPosition, size, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
, m_loading_html(loading_html)
, m_script_message_hadler_names (message_handler_names)
@ -158,7 +158,7 @@ void WebViewDialog::on_idle(wxIdleEvent& WXUNUSED(evt))
wxSetCursor(wxNullCursor);
if (m_load_error_page) {
m_load_error_page = false;
m_browser->LoadURL(GUI::format_wxstr("file://%1%/web/connection_failed.html", boost::filesystem::path(resources_dir()).generic_string()));
m_browser->LoadURL(GUI::format_wxstr("file://%1%/web/error_no_reload.html", boost::filesystem::path(resources_dir()).generic_string()));
}
}
#ifdef DEBUG_URL_PANEL

View File

@ -24,7 +24,7 @@ namespace GUI {
class WebViewDialog : public DPIDialog
{
public:
WebViewDialog(wxWindow* parent, const wxString& url, const wxString& dialog_name, const wxSize& size, const std::vector<std::string>& message_handler_names, const std::string& loading_html = "loading");
WebViewDialog(wxWindow* parent, const wxString& url, const wxString& dialog_name, const wxSize& size, const std::vector<std::string>& message_handler_names, const std::string& loading_html = "other_loading");
virtual ~WebViewDialog();
virtual void on_show(wxShowEvent& evt) {};

View File

@ -166,26 +166,7 @@ WebViewPanel::WebViewPanel(wxWindow *parent, const wxString& default_url, const
return;
}
m_do_late_webview_create = false;
m_browser = WebView::webview_new();
if (!m_browser) {
wxStaticText* text = new wxStaticText(this, wxID_ANY, _L("Failed to load a web browser."));
topsizer->Add(text, 0, wxALIGN_LEFT | wxBOTTOM, 10);
return;
}
WebView::webview_create(m_browser,this, GUI::format_wxstr("file://%1%/web/%2%.html", boost::filesystem::path(resources_dir()).generic_string(), m_loading_html), m_script_message_hadler_names);
if (Utils::ServiceConfig::instance().webdev_enabled()) {
m_browser->EnableContextMenu();
m_browser->EnableAccessToDevTools();
}
topsizer->Add(m_browser, wxSizerFlags().Expand().Proportion(1));
// Connect the webview events
Bind(wxEVT_WEBVIEW_ERROR, &WebViewPanel::on_error, this, m_browser->GetId());
Bind(wxEVT_WEBVIEW_SCRIPT_MESSAGE_RECEIVED, &WebViewPanel::on_script_message, this, m_browser->GetId());
Bind(wxEVT_WEBVIEW_NAVIGATING, &WebViewPanel::on_navigation_request, this, m_browser->GetId());
late_create();
}
void WebViewPanel::late_create()
@ -265,6 +246,14 @@ void WebViewPanel::on_idle(wxIdleEvent& WXUNUSED(evt))
load_default_url();
} else {
load_url(GUI::format_wxstr("file://%1%/web/%2%.html", boost::filesystem::path(resources_dir()).generic_string(), m_error_html));
// This is a fix of broken message handling after error.
// F.e. if there is an error but we do AddUserScript & Reload, the handling will break.
// So we just reset the handler here.
if (!m_script_message_hadler_names.empty()) {
m_browser->RemoveScriptMessageHandler(Slic3r::GUI::from_u8(m_script_message_hadler_names.front()));
bool b = m_browser->AddScriptMessageHandler(Slic3r::GUI::from_u8(m_script_message_hadler_names.front()));
}
}
}
}
@ -433,6 +422,9 @@ void WebViewPanel::on_run_script_custom(wxCommandEvent& WXUNUSED(evt))
void WebViewPanel::on_add_user_script(wxCommandEvent& WXUNUSED(evt))
{
if (!m_browser) {
return;
}
wxString userScript = "window.wx_test_var = 'wxWidgets webview sample';";
wxTextEntryDialog dialog
(
@ -572,12 +564,9 @@ void WebViewPanel::sys_color_changed()
}
ConnectWebViewPanel::ConnectWebViewPanel(wxWindow* parent)
: WebViewPanel(parent, GUI::from_u8(Utils::ServiceConfig::instance().connect_url()), { "_prusaSlicer" }, "connect_loading_reload", "connect_connection_failed", false)
: WebViewPanel(parent, GUI::from_u8(Utils::ServiceConfig::instance().connect_url()), { "_prusaSlicer" }, "connect_loading", "connect_error", false)
{
// m_browser->RegisterHandler(wxSharedPtr<wxWebViewHandler>(new WebViewHandler("https")));
auto* plater = wxGetApp().plater();
//plater->Bind(EVT_UA_ID_USER_SUCCESS, &ConnectWebViewPanel::on_user_token, this);
plater->Bind(EVT_UA_LOGGEDOUT, &ConnectWebViewPanel::on_user_logged_out, this);
}
@ -588,7 +577,7 @@ void ConnectWebViewPanel::late_create()
return;
}
// from ConnectWebViewPanel::on_user_token
// This code used to be inside plater->Bind(EVT_UA_ID_USER_SUCCESS, &ConnectWebViewPanel::on_user_token, this)
auto access_token = wxGetApp().plater()->get_user_account()->get_access_token();
assert(!access_token.empty());
@ -600,7 +589,6 @@ void ConnectWebViewPanel::late_create()
ConnectWebViewPanel::~ConnectWebViewPanel()
{
//m_browser->Unbind(EVT_UA_ID_USER_SUCCESS, &ConnectWebViewPanel::on_user_token, this);
}
wxString ConnectWebViewPanel::get_login_script(bool refresh)
@ -748,28 +736,19 @@ wxString ConnectWebViewPanel::get_logout_script()
void ConnectWebViewPanel::on_page_will_load()
{
if (!m_browser) {
return;
}
auto javascript = get_login_script(false);
BOOST_LOG_TRIVIAL(debug) << "RunScript " << javascript << "\n";
m_browser->AddUserScript(javascript);
}
void ConnectWebViewPanel::on_user_token(UserAccountSuccessEvent& e)
{
e.Skip();
/*
auto access_token = wxGetApp().plater()->get_user_account()->get_access_token();
assert(!access_token.empty());
wxString javascript = get_login_script(true);
BOOST_LOG_TRIVIAL(debug) << "RunScript " << javascript << "\n";
m_browser->RunScriptAsync(javascript);
resend_config();
*/
}
void ConnectWebViewPanel::on_user_logged_out(UserAccountSuccessEvent& e)
{
e.Skip();
if (!m_browser)
return;
// clear token from session storage
m_browser->RunScriptAsync(get_logout_script());
}
@ -864,16 +843,16 @@ void ConnectWebViewPanel::on_connect_action_print(const std::string& message_dat
}
PrinterWebViewPanel::PrinterWebViewPanel(wxWindow* parent, const wxString& default_url)
: WebViewPanel(parent, default_url, {"ExternalApp"}, "other_loading_reload", "other_error", false)
: WebViewPanel(parent, default_url, {"ExternalApp"}, "other_loading", "other_error", false)
{
}
void PrinterWebViewPanel::on_loaded(wxWebViewEvent& evt)
{
if (evt.GetURL().IsEmpty())
return;
m_load_default_url_on_next_error = false;
if (!m_api_key.empty()) {
send_api_key();
} else if (!m_usr.empty() && !m_psk.empty()) {
@ -908,7 +887,6 @@ void PrinterWebViewPanel::send_api_key()
sessionStorage.setItem('apiKey', '%s');
)",
key);
m_browser->RemoveAllUserScripts();
BOOST_LOG_TRIVIAL(debug) << "RunScript " << script << "\n";
m_browser->AddUserScript(script);
@ -933,7 +911,7 @@ void PrinterWebViewPanel::sys_color_changed()
PrintablesWebViewPanel::PrintablesWebViewPanel(wxWindow* parent)
: WebViewPanel(parent, GUI::from_u8(Utils::ServiceConfig::instance().printables_url()), { "ExternalApp" }, "other_loading_reload", "other_error", false)
: WebViewPanel(parent, GUI::from_u8(Utils::ServiceConfig::instance().printables_url()), { "ExternalApp" }, "other_loading", "other_error", false)
{
@ -979,7 +957,7 @@ void PrintablesWebViewPanel::on_navigation_request(wxWebViewEvent &evt)
const wxString url = evt.GetURL();
if (url.StartsWith(m_default_url)) {
m_reached_default_url = true;
} else if (m_reached_default_url) {
} else if (m_reached_default_url && url.StartsWith("http")) {
BOOST_LOG_TRIVIAL(info) << evt.GetURL() << " does not start with default url. Vetoing.";
evt.Veto();
}
@ -1068,7 +1046,7 @@ void PrintablesWebViewPanel::after_on_show(wxShowEvent& evt)
void PrintablesWebViewPanel::logout(const std::string& override_url/* = std::string()*/)
{
if (!m_shown) {
if (!m_shown || !m_browser) {
return;
}
delete_cookies(m_browser, Utils::ServiceConfig::instance().printables_url());
@ -1113,6 +1091,9 @@ void PrintablesWebViewPanel::login(const std::string& access_token, const std::s
void PrintablesWebViewPanel::load_default_url()
{
if (!m_browser) {
return;
}
std::string actual_default_url = get_url_lang_theme(from_u8(Utils::ServiceConfig::instance().printables_url() + "/homepage"));
const std::string access_token = wxGetApp().plater()->get_user_account()->get_access_token();
@ -1161,7 +1142,7 @@ void PrintablesWebViewPanel::on_script_message(wxWebViewEvent& evt)
void PrintablesWebViewPanel::sys_color_changed()
{
if (m_shown) {
if (m_shown && m_browser) {
load_url(GUI::from_u8(get_url_lang_theme(m_browser->GetCurrentURL())));
}
WebViewPanel::sys_color_changed();
@ -1182,8 +1163,6 @@ void PrintablesWebViewPanel::on_reload_event(const std::string& message_data)
}
void PrintablesWebViewPanel::on_printables_event_print_gcode(const std::string& message_data)
{
BOOST_LOG_TRIVIAL(error) << __FUNCTION__<< " " << message_data;
// { "event": "downloadFile", "url": "https://media.printables.com/somesecure.stl", "modelUrl": "https://www.printables.com/model/123" }
std::string download_url;
std::string model_url;

View File

@ -42,7 +42,7 @@ public:
virtual void on_script_message(wxWebViewEvent& evt);
void on_idle(wxIdleEvent& evt);
void on_loaded(wxWebViewEvent& evt);
virtual void on_loaded(wxWebViewEvent& evt);
void on_url(wxCommandEvent& evt);
virtual void on_back_button(wxCommandEvent& evt);
virtual void on_forward_button(wxCommandEvent& evt);
@ -144,7 +144,6 @@ protected:
private:
static wxString get_login_script(bool refresh);
static wxString get_logout_script();
void on_user_token(UserAccountSuccessEvent& e);
void on_user_logged_out(UserAccountSuccessEvent& e);
};
@ -153,25 +152,20 @@ class PrinterWebViewPanel : public WebViewPanel
public:
PrinterWebViewPanel(wxWindow* parent, const wxString& default_url);
void on_loaded(wxWebViewEvent& evt);
void on_loaded(wxWebViewEvent& evt) override;
void on_script_message(wxWebViewEvent& evt) override;
void send_api_key();
void send_credentials();
void set_api_key(const std::string &key)
{
if (m_api_key != key) {
clear();
m_api_key = key;
}
clear();
m_api_key = key;
}
void set_credentials(const std::string &usr, const std::string &psk)
{
if (m_usr != usr || m_psk != psk) {
clear();
m_usr = usr;
m_psk = psk;
}
clear();
m_usr = usr;
m_psk = psk;
}
void clear() { m_api_key.clear(); m_usr.clear(); m_psk.clear(); m_api_key_sent = false; }
void sys_color_changed() override;
@ -187,7 +181,7 @@ class PrintablesWebViewPanel : public WebViewPanel
public:
PrintablesWebViewPanel(wxWindow* parent);
void on_navigation_request(wxWebViewEvent &evt) override;
void on_loaded(wxWebViewEvent& evt);
void on_loaded(wxWebViewEvent& evt) override;
void after_on_show(wxShowEvent& evt) override;
void on_script_message(wxWebViewEvent& evt) override;
void sys_color_changed() override;