mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-06 10:32:05 +08:00
103 lines
3.1 KiB
C++
103 lines
3.1 KiB
C++
|
|
#ifndef WV2COMHANDLER_H
|
|
#define WV2COMHANDLER_H
|
|
|
|
#include "ffenestri_windows.h"
|
|
#include "windows/WebView2.h"
|
|
|
|
#include <locale>
|
|
#include <codecvt>
|
|
|
|
class wv2ComHandler
|
|
: public ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler,
|
|
public ICoreWebView2CreateCoreWebView2ControllerCompletedHandler,
|
|
public ICoreWebView2WebMessageReceivedEventHandler,
|
|
public ICoreWebView2PermissionRequestedEventHandler
|
|
{
|
|
|
|
struct Application *app;
|
|
HWND window;
|
|
messageCallback mcb;
|
|
comHandlerCallback cb;
|
|
|
|
public:
|
|
wv2ComHandler(struct Application *app, HWND window, messageCallback mcb, comHandlerCallback cb) {
|
|
this->app = app;
|
|
this->window = window;
|
|
this->mcb = mcb;
|
|
this->cb = cb;
|
|
}
|
|
ULONG STDMETHODCALLTYPE AddRef() { return 1; }
|
|
ULONG STDMETHODCALLTYPE Release() { return 1; }
|
|
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, LPVOID *ppv) {
|
|
return S_OK;
|
|
}
|
|
HRESULT STDMETHODCALLTYPE Invoke(HRESULT res,
|
|
ICoreWebView2Environment *env) {
|
|
env->CreateCoreWebView2Controller(window, this);
|
|
return S_OK;
|
|
}
|
|
HRESULT STDMETHODCALLTYPE Invoke(HRESULT res,
|
|
ICoreWebView2Controller *controller) {
|
|
controller->AddRef();
|
|
|
|
ICoreWebView2 *webview;
|
|
::EventRegistrationToken token;
|
|
controller->get_CoreWebView2(&webview);
|
|
webview->add_WebMessageReceived(this, &token);
|
|
webview->add_PermissionRequested(this, &token);
|
|
|
|
cb(controller);
|
|
return S_OK;
|
|
}
|
|
|
|
// This is called when JS posts a message back to webkit
|
|
HRESULT STDMETHODCALLTYPE Invoke(
|
|
ICoreWebView2 *sender, ICoreWebView2WebMessageReceivedEventArgs *args) {
|
|
LPWSTR message;
|
|
args->TryGetWebMessageAsString(&message);
|
|
if ( message == nullptr ) {
|
|
return S_OK;
|
|
}
|
|
const char *m = LPWSTRToCstr(message);
|
|
|
|
// check for internal messages
|
|
if (strcmp(m, "completed") == 0) {
|
|
completed(app);
|
|
return S_OK;
|
|
}
|
|
|
|
switch(m[0]) {
|
|
|
|
// Standard message for backend
|
|
case 'S':
|
|
printf("--> Message to backend: %s\n", &m[1]);
|
|
messageFromWindowCallback(&m[1]);
|
|
break;
|
|
// DOM Initialised
|
|
case 'I':
|
|
loadAssets(app);
|
|
break;
|
|
|
|
default:
|
|
printf("----> Unknown message type: %c\n", m[0]);
|
|
}
|
|
delete[] m;
|
|
return S_OK;
|
|
}
|
|
HRESULT STDMETHODCALLTYPE
|
|
Invoke(ICoreWebView2 *sender,
|
|
ICoreWebView2PermissionRequestedEventArgs *args) {
|
|
printf("DDDDDDDDDDDD\n");
|
|
|
|
COREWEBVIEW2_PERMISSION_KIND kind;
|
|
args->get_PermissionKind(&kind);
|
|
if (kind == COREWEBVIEW2_PERMISSION_KIND_CLIPBOARD_READ) {
|
|
args->put_State(COREWEBVIEW2_PERMISSION_STATE_ALLOW);
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
};
|
|
|
|
#endif |