webview2_com/
callback.rs

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
70/// Generic closure signature for [`completed_callback`].
71pub type CompletedClosure<Arg1, Arg2> = Box<
72    dyn FnOnce(
73        <Arg1 as ClosureArg>::Output,
74        <Arg2 as ClosureArg>::Output,
75    ) -> ::windows::core::Result<()>,
76>;
77
78/// Generic closure signature for [`event_callback`].
79pub 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}