Chandra
view release on metacpan or search on metacpan
include/webview-edge.c view on Meta::CPAN
HRESULT (STDMETHODCALLTYPE *add_MoveFocusRequested)(ICoreWebView2Controller*, void*, EventRegistrationToken*);
HRESULT (STDMETHODCALLTYPE *remove_MoveFocusRequested)(ICoreWebView2Controller*, EventRegistrationToken);
HRESULT (STDMETHODCALLTYPE *add_GotFocus)(ICoreWebView2Controller*, void*, EventRegistrationToken*);
HRESULT (STDMETHODCALLTYPE *remove_GotFocus)(ICoreWebView2Controller*, EventRegistrationToken);
HRESULT (STDMETHODCALLTYPE *add_LostFocus)(ICoreWebView2Controller*, void*, EventRegistrationToken*);
HRESULT (STDMETHODCALLTYPE *remove_LostFocus)(ICoreWebView2Controller*, EventRegistrationToken);
HRESULT (STDMETHODCALLTYPE *add_AcceleratorKeyPressed)(ICoreWebView2Controller*, void*, EventRegistrationToken*);
HRESULT (STDMETHODCALLTYPE *remove_AcceleratorKeyPressed)(ICoreWebView2Controller*, EventRegistrationToken);
HRESULT (STDMETHODCALLTYPE *get_ParentWindow)(ICoreWebView2Controller*, HWND*);
HRESULT (STDMETHODCALLTYPE *put_ParentWindow)(ICoreWebView2Controller*, HWND);
HRESULT (STDMETHODCALLTYPE *NotifyParentWindowPositionChanged)(ICoreWebView2Controller*);
HRESULT (STDMETHODCALLTYPE *Close)(ICoreWebView2Controller*);
HRESULT (STDMETHODCALLTYPE *get_CoreWebView2)(ICoreWebView2Controller*, ICoreWebView2**);
} ICoreWebView2ControllerVtbl;
struct ICoreWebView2Controller {
const ICoreWebView2ControllerVtbl *lpVtbl;
};
/* ---- ICoreWebView2Environment interface ---- */
typedef struct ICoreWebView2EnvironmentVtbl {
/* IUnknown */
HRESULT (STDMETHODCALLTYPE *QueryInterface)(ICoreWebView2Environment*, REFIID, void**);
ULONG (STDMETHODCALLTYPE *AddRef)(ICoreWebView2Environment*);
ULONG (STDMETHODCALLTYPE *Release)(ICoreWebView2Environment*);
/* ICoreWebView2Environment */
HRESULT (STDMETHODCALLTYPE *CreateCoreWebView2Controller)(
ICoreWebView2Environment*, HWND, ICoreWebView2CreateCoreWebView2ControllerCompletedHandler*);
HRESULT (STDMETHODCALLTYPE *CreateWebResourceResponse)(
ICoreWebView2Environment*, void*, int, LPCWSTR, LPCWSTR, void**);
HRESULT (STDMETHODCALLTYPE *get_BrowserVersionString)(ICoreWebView2Environment*, LPWSTR*);
HRESULT (STDMETHODCALLTYPE *add_NewBrowserVersionAvailable)(
ICoreWebView2Environment*, void*, EventRegistrationToken*);
HRESULT (STDMETHODCALLTYPE *remove_NewBrowserVersionAvailable)(
ICoreWebView2Environment*, EventRegistrationToken);
} ICoreWebView2EnvironmentVtbl;
struct ICoreWebView2Environment {
const ICoreWebView2EnvironmentVtbl *lpVtbl;
};
/* ---- ICoreWebView2Settings interface ---- */
typedef struct ICoreWebView2SettingsVtbl {
/* IUnknown */
HRESULT (STDMETHODCALLTYPE *QueryInterface)(ICoreWebView2Settings*, REFIID, void**);
ULONG (STDMETHODCALLTYPE *AddRef)(ICoreWebView2Settings*);
ULONG (STDMETHODCALLTYPE *Release)(ICoreWebView2Settings*);
/* ICoreWebView2Settings */
HRESULT (STDMETHODCALLTYPE *get_IsScriptEnabled)(ICoreWebView2Settings*, BOOL*);
HRESULT (STDMETHODCALLTYPE *put_IsScriptEnabled)(ICoreWebView2Settings*, BOOL);
HRESULT (STDMETHODCALLTYPE *get_IsWebMessageEnabled)(ICoreWebView2Settings*, BOOL*);
HRESULT (STDMETHODCALLTYPE *put_IsWebMessageEnabled)(ICoreWebView2Settings*, BOOL);
HRESULT (STDMETHODCALLTYPE *get_AreDefaultScriptDialogsEnabled)(ICoreWebView2Settings*, BOOL*);
HRESULT (STDMETHODCALLTYPE *put_AreDefaultScriptDialogsEnabled)(ICoreWebView2Settings*, BOOL);
HRESULT (STDMETHODCALLTYPE *get_IsStatusBarEnabled)(ICoreWebView2Settings*, BOOL*);
HRESULT (STDMETHODCALLTYPE *put_IsStatusBarEnabled)(ICoreWebView2Settings*, BOOL);
HRESULT (STDMETHODCALLTYPE *get_AreDevToolsEnabled)(ICoreWebView2Settings*, BOOL*);
HRESULT (STDMETHODCALLTYPE *put_AreDevToolsEnabled)(ICoreWebView2Settings*, BOOL);
HRESULT (STDMETHODCALLTYPE *get_AreDefaultContextMenusEnabled)(ICoreWebView2Settings*, BOOL*);
HRESULT (STDMETHODCALLTYPE *put_AreDefaultContextMenusEnabled)(ICoreWebView2Settings*, BOOL);
HRESULT (STDMETHODCALLTYPE *get_AreHostObjectsAllowed)(ICoreWebView2Settings*, BOOL*);
HRESULT (STDMETHODCALLTYPE *put_AreHostObjectsAllowed)(ICoreWebView2Settings*, BOOL);
HRESULT (STDMETHODCALLTYPE *get_IsZoomControlEnabled)(ICoreWebView2Settings*, BOOL*);
HRESULT (STDMETHODCALLTYPE *put_IsZoomControlEnabled)(ICoreWebView2Settings*, BOOL);
HRESULT (STDMETHODCALLTYPE *get_IsBuiltInErrorPageEnabled)(ICoreWebView2Settings*, BOOL*);
HRESULT (STDMETHODCALLTYPE *put_IsBuiltInErrorPageEnabled)(ICoreWebView2Settings*, BOOL);
} ICoreWebView2SettingsVtbl;
struct ICoreWebView2Settings {
const ICoreWebView2SettingsVtbl *lpVtbl;
};
/* ---- WebMessageReceivedEventArgs interface ---- */
typedef struct ICoreWebView2WebMessageReceivedEventArgsVtbl {
HRESULT (STDMETHODCALLTYPE *QueryInterface)(ICoreWebView2WebMessageReceivedEventArgs*, REFIID, void**);
ULONG (STDMETHODCALLTYPE *AddRef)(ICoreWebView2WebMessageReceivedEventArgs*);
ULONG (STDMETHODCALLTYPE *Release)(ICoreWebView2WebMessageReceivedEventArgs*);
HRESULT (STDMETHODCALLTYPE *get_Source)(ICoreWebView2WebMessageReceivedEventArgs*, LPWSTR*);
HRESULT (STDMETHODCALLTYPE *get_WebMessageAsJson)(ICoreWebView2WebMessageReceivedEventArgs*, LPWSTR*);
HRESULT (STDMETHODCALLTYPE *TryGetWebMessageAsString)(ICoreWebView2WebMessageReceivedEventArgs*, LPWSTR*);
} ICoreWebView2WebMessageReceivedEventArgsVtbl;
struct ICoreWebView2WebMessageReceivedEventArgs {
const ICoreWebView2WebMessageReceivedEventArgsVtbl *lpVtbl;
};
/* ---- Handler interfaces ---- */
typedef struct ICoreWebView2WebMessageReceivedEventHandlerVtbl {
HRESULT (STDMETHODCALLTYPE *QueryInterface)(ICoreWebView2WebMessageReceivedEventHandler*, REFIID, void**);
ULONG (STDMETHODCALLTYPE *AddRef)(ICoreWebView2WebMessageReceivedEventHandler*);
ULONG (STDMETHODCALLTYPE *Release)(ICoreWebView2WebMessageReceivedEventHandler*);
HRESULT (STDMETHODCALLTYPE *Invoke)(ICoreWebView2WebMessageReceivedEventHandler*, ICoreWebView2*, ICoreWebView2WebMessageReceivedEventArgs*);
} ICoreWebView2WebMessageReceivedEventHandlerVtbl;
struct ICoreWebView2WebMessageReceivedEventHandler {
const ICoreWebView2WebMessageReceivedEventHandlerVtbl *lpVtbl;
};
/* ---- Completed handler interfaces ---- */
typedef struct ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerVtbl {
HRESULT (STDMETHODCALLTYPE *QueryInterface)(ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler*, REFIID, void**);
ULONG (STDMETHODCALLTYPE *AddRef)(ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler*);
ULONG (STDMETHODCALLTYPE *Release)(ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler*);
HRESULT (STDMETHODCALLTYPE *Invoke)(ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler*, HRESULT, ICoreWebView2Environment*);
} ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerVtbl;
struct ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler {
const ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerVtbl *lpVtbl;
};
typedef struct ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerVtbl {
HRESULT (STDMETHODCALLTYPE *QueryInterface)(ICoreWebView2CreateCoreWebView2ControllerCompletedHandler*, REFIID, void**);
ULONG (STDMETHODCALLTYPE *AddRef)(ICoreWebView2CreateCoreWebView2ControllerCompletedHandler*);
ULONG (STDMETHODCALLTYPE *Release)(ICoreWebView2CreateCoreWebView2ControllerCompletedHandler*);
HRESULT (STDMETHODCALLTYPE *Invoke)(ICoreWebView2CreateCoreWebView2ControllerCompletedHandler*, HRESULT, ICoreWebView2Controller*);
} ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerVtbl;
include/webview-edge.c view on Meta::CPAN
static ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandlerVtbl eh_vtbl = {
eh_QueryInterface, eh_AddRef, eh_Release, eh_Invoke
};
/* ControllerHandler */
static HRESULT STDMETHODCALLTYPE ch_QueryInterface(ICoreWebView2CreateCoreWebView2ControllerCompletedHandler *This, REFIID riid, void **ppv) {
(void)riid;
*ppv = This;
This->lpVtbl->AddRef(This);
return S_OK;
}
static ULONG STDMETHODCALLTYPE ch_AddRef(ICoreWebView2CreateCoreWebView2ControllerCompletedHandler *This) {
ControllerHandler *h = (ControllerHandler *)This;
return InterlockedIncrement(&h->ref);
}
static ULONG STDMETHODCALLTYPE ch_Release(ICoreWebView2CreateCoreWebView2ControllerCompletedHandler *This) {
ControllerHandler *h = (ControllerHandler *)This;
LONG ref = InterlockedDecrement(&h->ref);
if (ref == 0) {
GlobalFree(h);
}
return ref;
}
static HRESULT STDMETHODCALLTYPE ch_Invoke(
ICoreWebView2CreateCoreWebView2ControllerCompletedHandler *This,
HRESULT result,
ICoreWebView2Controller *controller) {
ControllerHandler *h = (ControllerHandler *)This;
if (FAILED(result) || !controller) {
return S_OK;
}
if (!h->w || !h->w->priv.webview2) {
return S_OK;
}
webview2 *wv2 = h->w->priv.webview2;
wv2->controller = controller;
controller->lpVtbl->AddRef(controller);
/* Get the CoreWebView2 */
ICoreWebView2 *webview = NULL;
controller->lpVtbl->get_CoreWebView2(controller, &webview);
if (!webview) {
return S_OK;
}
wv2->webview = webview;
/* Configure settings */
ICoreWebView2Settings *settings = NULL;
webview->lpVtbl->get_Settings(webview, &settings);
if (settings) {
settings->lpVtbl->put_IsScriptEnabled(settings, TRUE);
settings->lpVtbl->put_IsWebMessageEnabled(settings, TRUE);
settings->lpVtbl->put_AreDefaultContextMenusEnabled(settings, h->w->debug ? TRUE : FALSE);
settings->lpVtbl->put_AreDevToolsEnabled(settings, h->w->debug ? TRUE : FALSE);
settings->lpVtbl->Release(settings);
}
/* Add web message handler */
WebMessageHandler *wmh = (WebMessageHandler *)GlobalAlloc(GPTR, sizeof(WebMessageHandler));
if (wmh) {
wmh->lpVtbl = &wmh_vtbl;
wmh->ref = 1;
wmh->w = h->w;
webview->lpVtbl->add_WebMessageReceived(webview, (ICoreWebView2WebMessageReceivedEventHandler *)wmh, &wv2->message_token);
wmh->lpVtbl->Release((ICoreWebView2WebMessageReceivedEventHandler *)wmh);
}
/* Inject bridge script */
static const wchar_t bridge_js[] =
L"window.external = window.external || {};"
L"window.external.invoke = function(s) {"
L" window.chrome.webview.postMessage(s);"
L"};";
webview->lpVtbl->AddScriptToExecuteOnDocumentCreated(webview, bridge_js, NULL);
/* Set bounds */
RECT rc;
GetClientRect(h->w->priv.hwnd, &rc);
controller->lpVtbl->put_Bounds(controller, rc);
controller->lpVtbl->put_IsVisible(controller, TRUE);
/* Mark as ready */
wv2->ready = 1;
/* Navigate to pending URL or HTML */
if (wv2->pending_url) {
webview2_navigate(h->w, wv2->pending_url);
GlobalFree(wv2->pending_url);
wv2->pending_url = NULL;
} else if (wv2->pending_html) {
webview2_set_html(h->w, wv2->pending_html);
GlobalFree(wv2->pending_html);
wv2->pending_html = NULL;
}
return S_OK;
}
static ICoreWebView2CreateCoreWebView2ControllerCompletedHandlerVtbl ch_vtbl = {
ch_QueryInterface, ch_AddRef, ch_Release, ch_Invoke
};
/* ---- WebView2 operations ---- */
static void webview2_create_controller(struct webview *w) {
if (!w || !w->priv.webview2 || !w->priv.webview2->environment) {
return;
}
ControllerHandler *ch = (ControllerHandler *)GlobalAlloc(GPTR, sizeof(ControllerHandler));
if (!ch) return;
ch->lpVtbl = &ch_vtbl;
( run in 0.558 second using v1.01-cache-2.11-cpan-39bf76dae61 )