From 0adf31169df50d6700cc62826ce6adbb80b98d90 Mon Sep 17 00:00:00 2001 From: Tobias Taschner Date: Wed, 14 Sep 2022 16:00:34 +0200 Subject: [PATCH] Add advanced handler to webview sample Demonstrate how to implement and use wxWebViewHandler::StartRequest() --- build/cmake/samples/CMakeLists.txt | 2 +- samples/webview/handler_advanced.html | 55 ++++++++++++++++++++++++++ samples/webview/webview.bkl | 6 +++ samples/webview/webview.cpp | 56 ++++++++++++++++++++++++++- 4 files changed, 116 insertions(+), 3 deletions(-) create mode 100644 samples/webview/handler_advanced.html diff --git a/build/cmake/samples/CMakeLists.txt b/build/cmake/samples/CMakeLists.txt index 015f171a6c..a016e010a0 100644 --- a/build/cmake/samples/CMakeLists.txt +++ b/build/cmake/samples/CMakeLists.txt @@ -153,7 +153,7 @@ wx_add_sample(uiaction DEPENDS wxUSE_UIACTIONSIMULATOR) wx_add_sample(validate validate.cpp validate.h DEPENDS wxUSE_VALIDATORS) wx_add_sample(vscroll vstest.cpp) wx_add_sample(webview LIBRARIES wxwebview - DATA ../help/doc.zip:doc.zip + DATA ../help/doc.zip:doc.zip handler_advanced.html NAME webviewsample DEPENDS wxUSE_WEBVIEW) if(TARGET webviewsample AND wxUSE_STC) wx_exe_link_libraries(webviewsample wxstc) diff --git a/samples/webview/handler_advanced.html b/samples/webview/handler_advanced.html new file mode 100644 index 0000000000..a5c048821f --- /dev/null +++ b/samples/webview/handler_advanced.html @@ -0,0 +1,55 @@ + + Advanced Handler Sample + + + + + + + +

+ This sample demonstrates how to use wxWebViewHandler::StartRequest() + to enable advanced requests from html and javascript in the web view. +

+ + Request URL
+
+ Request content type
+
+ Request Data
+ +
+
+ Response Data
+ + + + diff --git a/samples/webview/webview.bkl b/samples/webview/webview.bkl index ac8f7a3f12..41837e121d 100644 --- a/samples/webview/webview.bkl +++ b/samples/webview/webview.bkl @@ -17,4 +17,10 @@ + + + handler_advanced.html + + + diff --git a/samples/webview/webview.cpp b/samples/webview/webview.cpp index b0a71da6a0..cf424feb28 100644 --- a/samples/webview/webview.cpp +++ b/samples/webview/webview.cpp @@ -164,6 +164,7 @@ public: void OnSelectAll(wxCommandEvent& evt); void OnLoadScheme(wxCommandEvent& evt); void OnUseMemoryFS(wxCommandEvent& evt); + void OnLoadAdvancedHandler(wxCommandEvent& evt); void OnFind(wxCommandEvent& evt); void OnFindDone(wxCommandEvent& evt); void OnFindText(wxCommandEvent& evt); @@ -257,6 +258,40 @@ public: SourceViewDialog(wxWindow* parent, wxString source); }; +// AdvancedWebViewHandler is a sample handler used by handler_advanced.html +// to show a sample implementation of wxWebViewHandler::StartRequest(). +// see the documentation for additional details. +class AdvancedWebViewHandler: public wxWebViewHandler +{ +public: + AdvancedWebViewHandler(): + wxWebViewHandler("wxpost") + { } + + virtual void StartRequest(const wxWebViewHandlerRequest& request, + wxSharedPtr response) wxOVERRIDE + { + response->SetHeader("Access-Control-Allow-Origin", "*"); + response->SetHeader("Access-Control-Allow-Headers", "*"); + + // Handle options request + if (request.GetMethod().IsSameAs("options", false)) + { + response->Finish(""); + return; + } + + response->SetContentType("application/json"); + response->Finish( + wxString::Format( + "{\n contentType: \"%s\",\n method: \"%s\",\n data: \"%s\"\n}", + request.GetHeader("Content-Type"), + request.GetMethod(), + request.GetDataString() + )); + } +}; + wxIMPLEMENT_APP(WebApp); // ============================================================================ @@ -383,6 +418,7 @@ WebFrame::WebFrame(const wxString& url) : // With WKWebView handlers need to be registered before creation m_browser->RegisterHandler(wxSharedPtr(new wxWebViewArchiveHandler("wxfs"))); m_browser->RegisterHandler(wxSharedPtr(new wxWebViewFSHandler("memory"))); + m_browser->RegisterHandler(wxSharedPtr(new AdvancedWebViewHandler())); #endif m_browser->Create(this, wxID_ANY, url, wxDefaultPosition, wxDefaultSize); topsizer->Add(m_browser, wxSizerFlags().Expand().Proportion(1)); @@ -397,6 +433,7 @@ WebFrame::WebFrame(const wxString& url) : m_browser->RegisterHandler(wxSharedPtr(new wxWebViewArchiveHandler("wxfs"))); //And the memory: file system m_browser->RegisterHandler(wxSharedPtr(new wxWebViewFSHandler("memory"))); + m_browser->RegisterHandler(wxSharedPtr(new AdvancedWebViewHandler())); #endif if (!m_browser->AddScriptMessageHandler("wx")) wxLogError("Could not add script message handler"); @@ -492,8 +529,11 @@ WebFrame::WebFrame(const wxString& url) : editmenu->AppendSubMenu(selection, "Selection"); - wxMenuItem* loadscheme = m_tools_menu->Append(wxID_ANY, _("Custom Scheme Example")); - wxMenuItem* usememoryfs = m_tools_menu->Append(wxID_ANY, _("Memory File System Example")); + wxMenu* handlers = new wxMenu(); + wxMenuItem* loadscheme = handlers->Append(wxID_ANY, _("Custom Scheme")); + wxMenuItem* usememoryfs = handlers->Append(wxID_ANY, _("Memory File System")); + wxMenuItem* advancedHandler = handlers->Append(wxID_ANY, _("Advanced Handler")); + m_tools_menu->AppendSubMenu(handlers, _("Handler Examples")); m_context_menu = m_tools_menu->AppendCheckItem(wxID_ANY, _("Enable Context Menu")); m_dev_tools = m_tools_menu->AppendCheckItem(wxID_ANY, _("Enable Dev Tools")); @@ -591,6 +631,7 @@ WebFrame::WebFrame(const wxString& url) : Bind(wxEVT_MENU, &WebFrame::OnSelectAll, this, selectall->GetId()); Bind(wxEVT_MENU, &WebFrame::OnLoadScheme, this, loadscheme->GetId()); Bind(wxEVT_MENU, &WebFrame::OnUseMemoryFS, this, usememoryfs->GetId()); + Bind(wxEVT_MENU, &WebFrame::OnLoadAdvancedHandler, this, advancedHandler->GetId()); Bind(wxEVT_MENU, &WebFrame::OnFind, this, m_find->GetId()); Bind(wxEVT_MENU, &WebFrame::OnEnableContextMenu, this, m_context_menu->GetId()); Bind(wxEVT_MENU, &WebFrame::OnEnableDevTools, this, m_dev_tools->GetId()); @@ -748,6 +789,17 @@ void WebFrame::OnUseMemoryFS(wxCommandEvent& WXUNUSED(evt)) m_browser->LoadURL("memory:page1.htm"); } +void WebFrame::OnLoadAdvancedHandler(wxCommandEvent& WXUNUSED(evt)) +{ + wxPathList pathlist; + pathlist.Add("."); + pathlist.Add(".."); + + wxString path = wxFileName(pathlist.FindValidPath("handler_advanced.html")).GetAbsolutePath(); + path = "file://" + path; + m_browser->LoadURL(path); +} + void WebFrame::OnEnableContextMenu(wxCommandEvent& evt) { m_browser->EnableContextMenu(evt.IsChecked());