Add advanced handler to webview sample

Demonstrate how to implement and use wxWebViewHandler::StartRequest()
This commit is contained in:
Tobias Taschner 2022-09-14 16:00:34 +02:00
parent d998d864e8
commit 0adf31169d
No known key found for this signature in database
GPG key ID: AE6ECD71294F87FD
4 changed files with 116 additions and 3 deletions

View file

@ -0,0 +1,55 @@
<head>
<title>Advanced Handler Sample</title>
<style>
.mono {
font-family: monospace;
}
</style>
<script>
function sendRequest() {
let url = document.getElementById("request_url").value;
let request_content_type = document.getElementById("request_content_type").value;
let request_data = document.getElementById("request_data").value;
console.log("clicked");
const req = new XMLHttpRequest();
req.addEventListener("load", (ev) => {
document.getElementById("response_response").value = req.responseText;
});
req.open("POST", url);
req.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
req.send(request_data);
}
</script>
</head>
<body>
<p>
This sample demonstrates how to use <i>wxWebViewHandler::StartRequest()</i>
to enable advanced requests from html and javascript in the web view.
</p>
Request URL<br />
<input id="request_url" size="40" value=""><br />
Request content type<br />
<input id="request_content_type" size="40" value="application/json"><br />
Request Data<br />
<textarea class="mono" cols="60" rows="8" id="request_data">{ param1: "wxwidgets", param2: "webview" }</textarea>
<br />
<button onclick="sendRequest()">Start request</button><br />
Response Data<br />
<textarea class="mono" cols="60" rows="8" id="response_response"></textarea>
<script>
// init request_url
let postURL;
if (navigator.userAgent.indexOf("Edg") > 0)
postURL = "https://wxpost.wxsite//main/test/1";
else
postURL = "wxpost://main/test/1";
document.getElementById("request_url").value = postURL;
</script>
</body>

View file

@ -17,4 +17,10 @@
</if>
</exe>
<wx-data id="data">
<files>
handler_advanced.html
</files>
</wx-data>
</makefile>

View file

@ -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<wxWebViewHandlerResponse> 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<wxWebViewHandler>(new wxWebViewArchiveHandler("wxfs")));
m_browser->RegisterHandler(wxSharedPtr<wxWebViewHandler>(new wxWebViewFSHandler("memory")));
m_browser->RegisterHandler(wxSharedPtr<wxWebViewHandler>(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<wxWebViewHandler>(new wxWebViewArchiveHandler("wxfs")));
//And the memory: file system
m_browser->RegisterHandler(wxSharedPtr<wxWebViewHandler>(new wxWebViewFSHandler("memory")));
m_browser->RegisterHandler(wxSharedPtr<wxWebViewHandler>(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());