1use windows::{
2 core::{IUnknown, Interface, Ref, BOOL, HRESULT, PCWSTR},
3 Win32::System::Com::IStream,
4};
5
6use windows_implement::implement;
7
8use crate::{pwstr::string_from_pcwstr, Microsoft::Web::WebView2::Win32::*};
9
10pub trait ClosureArg {
11 type Output: Sized;
12}
13
14pub trait InvokeArg<'a> {
15 type Input: 'a;
16
17 fn convert(input: Self::Input) -> <Self as ClosureArg>::Output
18 where
19 Self: ClosureArg;
20}
21
22impl ClosureArg for HRESULT {
23 type Output = windows::core::Result<()>;
24}
25
26impl InvokeArg<'_> for HRESULT {
27 type Input = Self;
28
29 fn convert(input: HRESULT) -> windows::core::Result<()> {
30 input.ok()
31 }
32}
33
34impl ClosureArg for BOOL {
35 type Output = bool;
36}
37
38impl InvokeArg<'_> for BOOL {
39 type Input = Self;
40
41 fn convert(input: BOOL) -> bool {
42 input.as_bool()
43 }
44}
45
46impl ClosureArg for PCWSTR {
47 type Output = String;
48}
49
50impl<'a> InvokeArg<'a> for PCWSTR {
51 type Input = &'a Self;
52
53 fn convert(input: &PCWSTR) -> String {
54 string_from_pcwstr(input)
55 }
56}
57
58impl<I: Interface> ClosureArg for Option<I> {
59 type Output = Self;
60}
61
62impl<'a, I: 'a + Interface + Clone> InvokeArg<'a> for Option<I> {
63 type Input = Ref<'a, I>;
64
65 fn convert(input: Ref<'a, I>) -> <Self as ClosureArg>::Output {
66 input.cloned()
67 }
68}
69
70pub type CompletedClosure<Arg1, Arg2> = Box<
72 dyn FnOnce(
73 <Arg1 as ClosureArg>::Output,
74 <Arg2 as ClosureArg>::Output,
75 ) -> ::windows::core::Result<()>,
76>;
77
78pub type EventClosure<Arg1, Arg2> = Box<
80 dyn FnMut(
81 <Arg1 as ClosureArg>::Output,
82 <Arg2 as ClosureArg>::Output,
83 ) -> windows::core::Result<()>,
84>;
85
86#[event_callback]
87pub struct IsDefaultDownloadDialogOpenChangedEventHandler(
88 ICoreWebView2IsDefaultDownloadDialogOpenChangedEventHandler,
89 Option<ICoreWebView2>,
90 Option<IUnknown>,
91);
92
93#[event_callback]
94pub struct IsDocumentPlayingAudioChangedEventHandler(
95 ICoreWebView2IsDocumentPlayingAudioChangedEventHandler,
96 Option<ICoreWebView2>,
97 Option<IUnknown>,
98);
99
100#[event_callback]
101pub struct IsMutedChangedEventHandler(
102 ICoreWebView2IsMutedChangedEventHandler,
103 Option<ICoreWebView2>,
104 Option<IUnknown>,
105);
106
107#[completed_callback]
108pub struct CreateCoreWebView2EnvironmentCompletedHandler(
109 ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler,
110 HRESULT,
111 Option<ICoreWebView2Environment>,
112);
113
114#[completed_callback]
115pub struct CreateCoreWebView2ControllerCompletedHandler(
116 ICoreWebView2CreateCoreWebView2ControllerCompletedHandler,
117 HRESULT,
118 Option<ICoreWebView2Controller>,
119);
120
121#[event_callback]
122pub struct NewBrowserVersionAvailableEventHandler(
123 ICoreWebView2NewBrowserVersionAvailableEventHandler,
124 Option<ICoreWebView2Environment>,
125 Option<IUnknown>,
126);
127
128#[completed_callback]
129pub struct CreateCoreWebView2CompositionControllerCompletedHandler(
130 ICoreWebView2CreateCoreWebView2CompositionControllerCompletedHandler,
131 HRESULT,
132 Option<ICoreWebView2CompositionController>,
133);
134
135#[event_callback]
136pub struct CursorChangedEventHandler(
137 ICoreWebView2CursorChangedEventHandler,
138 Option<ICoreWebView2CompositionController>,
139 Option<IUnknown>,
140);
141
142#[event_callback]
143pub struct ZoomFactorChangedEventHandler(
144 ICoreWebView2ZoomFactorChangedEventHandler,
145 Option<ICoreWebView2Controller>,
146 Option<IUnknown>,
147);
148
149#[event_callback]
150pub struct MoveFocusRequestedEventHandler(
151 ICoreWebView2MoveFocusRequestedEventHandler,
152 Option<ICoreWebView2Controller>,
153 Option<ICoreWebView2MoveFocusRequestedEventArgs>,
154);
155
156#[event_callback]
157pub struct FocusChangedEventHandler(
158 ICoreWebView2FocusChangedEventHandler,
159 Option<ICoreWebView2Controller>,
160 Option<IUnknown>,
161);
162
163#[event_callback]
164pub struct AcceleratorKeyPressedEventHandler(
165 ICoreWebView2AcceleratorKeyPressedEventHandler,
166 Option<ICoreWebView2Controller>,
167 Option<ICoreWebView2AcceleratorKeyPressedEventArgs>,
168);
169
170#[event_callback]
171pub struct ProcessInfosChangedEventHandler(
172 ICoreWebView2ProcessInfosChangedEventHandler,
173 Option<ICoreWebView2Environment>,
174 Option<IUnknown>,
175);
176
177#[event_callback]
178pub struct RasterizationScaleChangedEventHandler(
179 ICoreWebView2RasterizationScaleChangedEventHandler,
180 Option<ICoreWebView2Controller>,
181 Option<IUnknown>,
182);
183
184#[event_callback]
185pub struct NavigationStartingEventHandler(
186 ICoreWebView2NavigationStartingEventHandler,
187 Option<ICoreWebView2>,
188 Option<ICoreWebView2NavigationStartingEventArgs>,
189);
190
191#[event_callback]
192pub struct ContentLoadingEventHandler(
193 ICoreWebView2ContentLoadingEventHandler,
194 Option<ICoreWebView2>,
195 Option<ICoreWebView2ContentLoadingEventArgs>,
196);
197
198#[event_callback]
199pub struct SourceChangedEventHandler(
200 ICoreWebView2SourceChangedEventHandler,
201 Option<ICoreWebView2>,
202 Option<ICoreWebView2SourceChangedEventArgs>,
203);
204
205#[event_callback]
206pub struct DOMContentLoadedEventHandler(
207 ICoreWebView2DOMContentLoadedEventHandler,
208 Option<ICoreWebView2>,
209 Option<ICoreWebView2DOMContentLoadedEventArgs>,
210);
211
212#[event_callback]
213pub struct HistoryChangedEventHandler(
214 ICoreWebView2HistoryChangedEventHandler,
215 Option<ICoreWebView2>,
216 Option<IUnknown>,
217);
218
219#[event_callback]
220pub struct NavigationCompletedEventHandler(
221 ICoreWebView2NavigationCompletedEventHandler,
222 Option<ICoreWebView2>,
223 Option<ICoreWebView2NavigationCompletedEventArgs>,
224);
225
226#[event_callback]
227pub struct ScriptDialogOpeningEventHandler(
228 ICoreWebView2ScriptDialogOpeningEventHandler,
229 Option<ICoreWebView2>,
230 Option<ICoreWebView2ScriptDialogOpeningEventArgs>,
231);
232
233#[event_callback]
234pub struct PermissionRequestedEventHandler(
235 ICoreWebView2PermissionRequestedEventHandler,
236 Option<ICoreWebView2>,
237 Option<ICoreWebView2PermissionRequestedEventArgs>,
238);
239
240#[completed_callback]
241pub struct GetNonDefaultPermissionSettingsCompletedHandler(
242 ICoreWebView2GetNonDefaultPermissionSettingsCompletedHandler,
243 HRESULT,
244 Option<ICoreWebView2PermissionSettingCollectionView>,
245);
246
247#[completed_callback]
248pub struct SetPermissionStateCompletedHandler(
249 ICoreWebView2SetPermissionStateCompletedHandler,
250 HRESULT,
251);
252
253#[event_callback]
254pub struct ProcessFailedEventHandler(
255 ICoreWebView2ProcessFailedEventHandler,
256 Option<ICoreWebView2>,
257 Option<ICoreWebView2ProcessFailedEventArgs>,
258);
259
260impl ClosureArg for COREWEBVIEW2_PRINT_STATUS {
261 type Output = Self;
262}
263
264impl InvokeArg<'_> for COREWEBVIEW2_PRINT_STATUS {
265 type Input = Self;
266
267 fn convert(input: Self) -> Self {
268 input
269 }
270}
271
272#[completed_callback]
273pub struct PrintCompletedHandler(
274 ICoreWebView2PrintCompletedHandler,
275 HRESULT,
276 COREWEBVIEW2_PRINT_STATUS,
277);
278
279#[completed_callback]
280pub struct PrintToPdfCompletedHandler(ICoreWebView2PrintToPdfCompletedHandler, HRESULT, BOOL);
281
282#[completed_callback]
283pub struct PrintToPdfStreamCompletedHandler(
284 ICoreWebView2PrintToPdfStreamCompletedHandler,
285 HRESULT,
286 Option<IStream>,
287);
288
289#[completed_callback]
290pub struct AddScriptToExecuteOnDocumentCreatedCompletedHandler(
291 ICoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandler,
292 HRESULT,
293 PCWSTR,
294);
295
296#[completed_callback]
297pub struct ExecuteScriptCompletedHandler(
298 ICoreWebView2ExecuteScriptCompletedHandler,
299 HRESULT,
300 PCWSTR,
301);
302
303#[completed_callback]
304pub struct CapturePreviewCompletedHandler(ICoreWebView2CapturePreviewCompletedHandler, HRESULT);
305
306#[event_callback]
307pub struct WebMessageReceivedEventHandler(
308 ICoreWebView2WebMessageReceivedEventHandler,
309 Option<ICoreWebView2>,
310 Option<ICoreWebView2WebMessageReceivedEventArgs>,
311);
312
313#[completed_callback]
314pub struct CallDevToolsProtocolMethodCompletedHandler(
315 ICoreWebView2CallDevToolsProtocolMethodCompletedHandler,
316 HRESULT,
317 PCWSTR,
318);
319
320#[event_callback]
321pub struct NewWindowRequestedEventHandler(
322 ICoreWebView2NewWindowRequestedEventHandler,
323 Option<ICoreWebView2>,
324 Option<ICoreWebView2NewWindowRequestedEventArgs>,
325);
326
327#[event_callback]
328pub struct DocumentTitleChangedEventHandler(
329 ICoreWebView2DocumentTitleChangedEventHandler,
330 Option<ICoreWebView2>,
331 Option<IUnknown>,
332);
333
334#[event_callback]
335pub struct ContainsFullScreenElementChangedEventHandler(
336 ICoreWebView2ContainsFullScreenElementChangedEventHandler,
337 Option<ICoreWebView2>,
338 Option<IUnknown>,
339);
340
341#[event_callback]
342pub struct WebResourceRequestedEventHandler(
343 ICoreWebView2WebResourceRequestedEventHandler,
344 Option<ICoreWebView2>,
345 Option<ICoreWebView2WebResourceRequestedEventArgs>,
346);
347
348#[event_callback]
349pub struct WebResourceResponseReceivedEventHandler(
350 ICoreWebView2WebResourceResponseReceivedEventHandler,
351 Option<ICoreWebView2>,
352 Option<ICoreWebView2WebResourceResponseReceivedEventArgs>,
353);
354
355#[completed_callback]
356pub struct WebResourceResponseViewGetContentCompletedHandler(
357 ICoreWebView2WebResourceResponseViewGetContentCompletedHandler,
358 HRESULT,
359 Option<IStream>,
360);
361
362#[event_callback]
363pub struct WindowCloseRequestedEventHandler(
364 ICoreWebView2WindowCloseRequestedEventHandler,
365 Option<ICoreWebView2>,
366 Option<IUnknown>,
367);
368
369#[event_callback]
370pub struct DownloadStartingEventHandler(
371 ICoreWebView2DownloadStartingEventHandler,
372 Option<ICoreWebView2>,
373 Option<ICoreWebView2DownloadStartingEventArgs>,
374);
375
376#[event_callback]
377pub struct BytesReceivedChangedEventHandler(
378 ICoreWebView2BytesReceivedChangedEventHandler,
379 Option<ICoreWebView2DownloadOperation>,
380 Option<IUnknown>,
381);
382
383#[event_callback]
384pub struct BrowserProcessExitedEventHandler(
385 ICoreWebView2BrowserProcessExitedEventHandler,
386 Option<ICoreWebView2Environment>,
387 Option<ICoreWebView2BrowserProcessExitedEventArgs>,
388);
389
390#[event_callback]
391pub struct EstimatedEndTimeChangedEventHandler(
392 ICoreWebView2EstimatedEndTimeChangedEventHandler,
393 Option<ICoreWebView2DownloadOperation>,
394 Option<IUnknown>,
395);
396
397#[event_callback]
398pub struct StateChangedEventHandler(
399 ICoreWebView2StateChangedEventHandler,
400 Option<ICoreWebView2DownloadOperation>,
401 Option<IUnknown>,
402);
403
404#[event_callback]
405pub struct DevToolsProtocolEventReceivedEventHandler(
406 ICoreWebView2DevToolsProtocolEventReceivedEventHandler,
407 Option<ICoreWebView2>,
408 Option<ICoreWebView2DevToolsProtocolEventReceivedEventArgs>,
409);
410
411#[event_callback]
412pub struct FrameContentLoadingEventHandler(
413 ICoreWebView2FrameContentLoadingEventHandler,
414 Option<ICoreWebView2Frame>,
415 Option<ICoreWebView2ContentLoadingEventArgs>,
416);
417
418#[event_callback]
419pub struct FrameCreatedEventHandler(
420 ICoreWebView2FrameCreatedEventHandler,
421 Option<ICoreWebView2>,
422 Option<ICoreWebView2FrameCreatedEventArgs>,
423);
424
425#[event_callback]
426pub struct FrameDOMContentLoadedEventHandler(
427 ICoreWebView2FrameDOMContentLoadedEventHandler,
428 Option<ICoreWebView2Frame>,
429 Option<ICoreWebView2DOMContentLoadedEventArgs>,
430);
431
432#[event_callback]
433pub struct FrameDestroyedEventHandler(
434 ICoreWebView2FrameDestroyedEventHandler,
435 Option<ICoreWebView2Frame>,
436 Option<IUnknown>,
437);
438
439#[event_callback]
440pub struct FrameNameChangedEventHandler(
441 ICoreWebView2FrameNameChangedEventHandler,
442 Option<ICoreWebView2Frame>,
443 Option<IUnknown>,
444);
445
446#[event_callback]
447pub struct ClientCertificateRequestedEventHandler(
448 ICoreWebView2ClientCertificateRequestedEventHandler,
449 Option<ICoreWebView2>,
450 Option<ICoreWebView2ClientCertificateRequestedEventArgs>,
451);
452
453#[completed_callback]
454pub struct FrameNavigationCompletedEventHandler(
455 ICoreWebView2FrameNavigationCompletedEventHandler,
456 Option<ICoreWebView2Frame>,
457 Option<ICoreWebView2NavigationCompletedEventArgs>,
458);
459
460#[event_callback]
461pub struct FrameNavigationStartingEventHandler(
462 ICoreWebView2FrameNavigationStartingEventHandler,
463 Option<ICoreWebView2Frame>,
464 Option<ICoreWebView2NavigationStartingEventArgs>,
465);
466
467#[event_callback]
468pub struct FrameWebMessageReceivedEventHandler(
469 ICoreWebView2FrameWebMessageReceivedEventHandler,
470 Option<ICoreWebView2Frame>,
471 Option<ICoreWebView2WebMessageReceivedEventArgs>,
472);
473
474#[completed_callback]
475pub struct GetCookiesCompletedHandler(
476 ICoreWebView2GetCookiesCompletedHandler,
477 HRESULT,
478 Option<ICoreWebView2CookieList>,
479);
480
481#[completed_callback]
482pub struct TrySuspendCompletedHandler(ICoreWebView2TrySuspendCompletedHandler, HRESULT, BOOL);
483
484#[event_callback]
485pub struct BasicAuthenticationRequestedEventHandler(
486 ICoreWebView2BasicAuthenticationRequestedEventHandler,
487 Option<ICoreWebView2>,
488 Option<ICoreWebView2BasicAuthenticationRequestedEventArgs>,
489);
490
491#[event_callback]
492pub struct ContextMenuRequestedEventHandler(
493 ICoreWebView2ContextMenuRequestedEventHandler,
494 Option<ICoreWebView2>,
495 Option<ICoreWebView2ContextMenuRequestedEventArgs>,
496);
497
498#[event_callback]
499pub struct CustomItemSelectedEventHandler(
500 ICoreWebView2CustomItemSelectedEventHandler,
501 Option<ICoreWebView2ContextMenuItem>,
502 Option<IUnknown>,
503);
504
505#[event_callback]
506pub struct FramePermissionRequestedEventHandler(
507 ICoreWebView2FramePermissionRequestedEventHandler,
508 Option<ICoreWebView2Frame>,
509 Option<ICoreWebView2PermissionRequestedEventArgs2>,
510);
511
512#[event_callback]
513pub struct StatusBarTextChangedEventHandler(
514 ICoreWebView2StatusBarTextChangedEventHandler,
515 Option<ICoreWebView2>,
516 Option<IUnknown>,
517);
518
519#[completed_callback]
520pub struct ClearBrowsingDataCompletedHandler(
521 ICoreWebView2ClearBrowsingDataCompletedHandler,
522 HRESULT,
523);
524
525#[completed_callback]
526pub struct ClearServerCertificateErrorActionsCompletedHandler(
527 ICoreWebView2ClearServerCertificateErrorActionsCompletedHandler,
528 HRESULT,
529);
530
531#[event_callback]
532pub struct ServerCertificateErrorDetectedEventHandler(
533 ICoreWebView2ServerCertificateErrorDetectedEventHandler,
534 Option<ICoreWebView2>,
535 Option<ICoreWebView2ServerCertificateErrorDetectedEventArgs>,
536);
537
538#[event_callback]
539pub struct FaviconChangedEventHandler(
540 ICoreWebView2FaviconChangedEventHandler,
541 Option<ICoreWebView2>,
542 Option<IUnknown>,
543);
544
545#[completed_callback]
546pub struct GetFaviconCompletedHandler(
547 ICoreWebView2GetFaviconCompletedHandler,
548 HRESULT,
549 Option<IStream>,
550);
551
552#[event_callback]
553pub struct LaunchingExternalUriSchemeEventHandler(
554 ICoreWebView2LaunchingExternalUriSchemeEventHandler,
555 Option<ICoreWebView2>,
556 Option<ICoreWebView2LaunchingExternalUriSchemeEventArgs>,
557);
558
559#[completed_callback]
560pub struct BrowserExtensionEnableCompletedHandler(
561 ICoreWebView2BrowserExtensionEnableCompletedHandler,
562 HRESULT,
563);
564
565#[completed_callback]
566pub struct BrowserExtensionRemoveCompletedHandler(
567 ICoreWebView2BrowserExtensionRemoveCompletedHandler,
568 HRESULT,
569);
570
571#[completed_callback]
572pub struct ExecuteScriptWithResultCompletedHandler(
573 ICoreWebView2ExecuteScriptWithResultCompletedHandler,
574 HRESULT,
575 Option<ICoreWebView2ExecuteScriptResult>,
576);
577
578#[completed_callback]
579pub struct GetProcessExtendedInfosCompletedHandler(
580 ICoreWebView2GetProcessExtendedInfosCompletedHandler,
581 HRESULT,
582 Option<ICoreWebView2ProcessExtendedInfoCollection>,
583);
584
585#[completed_callback]
586pub struct ProfileAddBrowserExtensionCompletedHandler(
587 ICoreWebView2ProfileAddBrowserExtensionCompletedHandler,
588 HRESULT,
589 Option<ICoreWebView2BrowserExtension>,
590);
591
592#[event_callback]
593pub struct ProfileDeletedEventHandler(
594 ICoreWebView2ProfileDeletedEventHandler,
595 Option<ICoreWebView2Profile>,
596 Option<IUnknown>,
597);
598
599#[completed_callback]
600pub struct ProfileGetBrowserExtensionsCompletedHandler(
601 ICoreWebView2ProfileGetBrowserExtensionsCompletedHandler,
602 HRESULT,
603 Option<ICoreWebView2BrowserExtensionList>,
604);
605
606#[event_callback]
607pub struct NonClientRegionChangedEventHandler(
608 ICoreWebView2NonClientRegionChangedEventHandler,
609 Option<ICoreWebView2CompositionController>,
610 Option<ICoreWebView2NonClientRegionChangedEventArgs>,
611);
612
613#[event_callback]
614pub struct FrameScreenCaptureStartingEventHandler(
615 ICoreWebView2FrameScreenCaptureStartingEventHandler,
616 Option<ICoreWebView2Frame>,
617 Option<ICoreWebView2ScreenCaptureStartingEventArgs>,
618);
619
620#[event_callback]
621pub struct NotificationCloseRequestedEventHandler(
622 ICoreWebView2NotificationCloseRequestedEventHandler,
623 Option<ICoreWebView2Notification>,
624 Option<IUnknown>,
625);
626
627#[event_callback]
628pub struct NotificationReceivedEventHandler(
629 ICoreWebView2NotificationReceivedEventHandler,
630 Option<ICoreWebView2>,
631 Option<ICoreWebView2NotificationReceivedEventArgs>,
632);
633
634#[event_callback]
635pub struct SaveAsUIShowingEventHandler(
636 ICoreWebView2SaveAsUIShowingEventHandler,
637 Option<ICoreWebView2>,
638 Option<ICoreWebView2SaveAsUIShowingEventArgs>,
639);
640
641#[event_callback]
642pub struct SaveFileSecurityCheckStartingEventHandler(
643 ICoreWebView2SaveFileSecurityCheckStartingEventHandler,
644 Option<ICoreWebView2>,
645 Option<ICoreWebView2SaveFileSecurityCheckStartingEventArgs>,
646);
647
648#[event_callback]
649pub struct ScreenCaptureStartingEventHandler(
650 ICoreWebView2ScreenCaptureStartingEventHandler,
651 Option<ICoreWebView2>,
652 Option<ICoreWebView2ScreenCaptureStartingEventArgs>,
653);
654
655impl ClosureArg for COREWEBVIEW2_SAVE_AS_UI_RESULT {
656 type Output = Self;
657}
658
659impl InvokeArg<'_> for COREWEBVIEW2_SAVE_AS_UI_RESULT {
660 type Input = Self;
661
662 fn convert(input: Self) -> Self {
663 input
664 }
665}
666
667#[completed_callback]
668pub struct ShowSaveAsUICompletedHandler(
669 ICoreWebView2ShowSaveAsUICompletedHandler,
670 HRESULT,
671 COREWEBVIEW2_SAVE_AS_UI_RESULT,
672);
673
674#[cfg(test)]
675mod test {
676 use std::collections::BTreeSet;
677
678 use regex::Regex;
679
680 use webview2_com_sys::declared_interfaces;
681
682 #[test]
683 fn all_implemented() {
684 let contents = include_str!("callback.rs");
685 let pattern = Regex::new(r#"(ICoreWebView2[A-Za-z0-9]+Handler)"#).expect("valid regex");
686 let implemented: BTreeSet<&str> = contents
687 .lines()
688 .filter_map(|line| pattern.captures(line))
689 .filter_map(|captures| captures.get(1))
690 .map(|match_1| match_1.as_str())
691 .collect();
692 let all_declared_callbacks = declared_interfaces::all_declared_callbacks();
693 let missing: Vec<_> = all_declared_callbacks
694 .iter()
695 .filter_map(|name| {
696 if implemented.contains(name) {
697 None
698 } else {
699 Some(name.to_string())
700 }
701 })
702 .collect();
703 let extra: Vec<_> = implemented
704 .iter()
705 .filter_map(|name| {
706 if all_declared_callbacks.contains(name) {
707 None
708 } else {
709 Some(name.to_string())
710 }
711 })
712 .collect();
713 assert!(
714 missing.is_empty() && extra.is_empty(),
715 "missing: {missing:?}\nextra: {extra:?}"
716 );
717 }
718}