Skip to main content

windows_webview/
settings.rs

1use super::*;
2
3/// The configurable settings of a [`WebView`], such as whether JavaScript, the
4/// dev tools, or the default context menus are enabled. Obtain it with
5/// [`WebView::settings`].
6///
7/// Each property is a getter / `set_*` pair; the setters take effect on the next
8/// navigation.
9pub struct Settings(pub(crate) ICoreWebView2Settings);
10
11macro_rules! settings_bool {
12    ($(#[$meta:meta])* $get:ident / $set:ident => $com_get:ident / $com_set:ident) => {
13        $(#[$meta])*
14        pub fn $get(&self) -> bool {
15            unsafe { self.0.$com_get() }.is_ok_and(|value| value.as_bool())
16        }
17
18        $(#[$meta])*
19        pub fn $set(&self, value: bool) -> Result<()> {
20            unsafe { self.0.$com_set(value) }.ok()
21        }
22    };
23}
24
25macro_rules! settings_versioned_bool {
26    ($iface:ty, $(#[$meta:meta])* $get:ident / $set:ident => $com_get:ident / $com_set:ident) => {
27        $(#[$meta])*
28        pub fn $get(&self) -> Result<bool> {
29            let source: $iface = self.0.cast()?;
30            Ok(unsafe { source.$com_get()? }.as_bool())
31        }
32
33        $(#[$meta])*
34        pub fn $set(&self, value: bool) -> Result<()> {
35            let source: $iface = self.0.cast()?;
36            unsafe { source.$com_set(value) }.ok()
37        }
38    };
39}
40
41impl Settings {
42    settings_bool! {
43        /// Whether running JavaScript is enabled.
44        is_script_enabled / set_script_enabled => IsScriptEnabled / SetIsScriptEnabled
45    }
46
47    settings_bool! {
48        /// Whether communicating with the host via `postMessage` is enabled.
49        is_web_message_enabled / set_web_message_enabled => IsWebMessageEnabled / SetIsWebMessageEnabled
50    }
51
52    settings_bool! {
53        /// Whether the default JavaScript dialogs (`alert`, `confirm`, `prompt`,
54        /// `beforeunload`) are shown.
55        are_default_script_dialogs_enabled / set_default_script_dialogs_enabled => AreDefaultScriptDialogsEnabled / SetAreDefaultScriptDialogsEnabled
56    }
57
58    settings_bool! {
59        /// Whether the status bar is displayed.
60        is_status_bar_enabled / set_status_bar_enabled => IsStatusBarEnabled / SetIsStatusBarEnabled
61    }
62
63    settings_bool! {
64        /// Whether the browser dev tools are available.
65        are_dev_tools_enabled / set_dev_tools_enabled => AreDevToolsEnabled / SetAreDevToolsEnabled
66    }
67
68    settings_bool! {
69        /// Whether the default right-click context menus are shown.
70        are_default_context_menus_enabled / set_default_context_menus_enabled => AreDefaultContextMenusEnabled / SetAreDefaultContextMenusEnabled
71    }
72
73    settings_bool! {
74        /// Whether host objects added via the WebView2 host-object APIs are
75        /// accessible from the page.
76        are_host_objects_allowed / set_host_objects_allowed => AreHostObjectsAllowed / SetAreHostObjectsAllowed
77    }
78
79    settings_bool! {
80        /// Whether zoom control (for example Ctrl+`+`/`-`) is enabled.
81        is_zoom_control_enabled / set_zoom_control_enabled => IsZoomControlEnabled / SetIsZoomControlEnabled
82    }
83
84    settings_bool! {
85        /// Whether the built-in error page is shown for navigation and rendering
86        /// failures.
87        is_built_in_error_page_enabled / set_built_in_error_page_enabled => IsBuiltInErrorPageEnabled / SetIsBuiltInErrorPageEnabled
88    }
89
90    /// Returns the user-agent string sent with requests and reported to script.
91    pub fn user_agent(&self) -> Result<String> {
92        let source: ICoreWebView2Settings2 = self.0.cast()?;
93        let value = unsafe { source.UserAgent()? };
94        Ok(unsafe { string::take(value) })
95    }
96
97    /// Overrides the user-agent string sent with requests and reported to script.
98    pub fn set_user_agent(&self, user_agent: &str) -> Result<()> {
99        let source: ICoreWebView2Settings2 = self.0.cast()?;
100        let user_agent = HSTRING::from(user_agent);
101        unsafe { source.SetUserAgent(&user_agent) }.ok()
102    }
103
104    settings_versioned_bool! {
105        ICoreWebView2Settings3,
106        /// Whether the browser's built-in accelerator keys (such as Ctrl+F or
107        /// F5) are enabled. Disable to handle these keys yourself via
108        /// [`Controller::on_accelerator_key_pressed`].
109        are_browser_accelerator_keys_enabled / set_browser_accelerator_keys_enabled => AreBrowserAcceleratorKeysEnabled / SetAreBrowserAcceleratorKeysEnabled
110    }
111
112    settings_versioned_bool! {
113        ICoreWebView2Settings4,
114        /// Whether general form autofill (names, addresses, and similar) is
115        /// enabled.
116        is_general_autofill_enabled / set_general_autofill_enabled => IsGeneralAutofillEnabled / SetIsGeneralAutofillEnabled
117    }
118
119    settings_versioned_bool! {
120        ICoreWebView2Settings4,
121        /// Whether saving and autofilling passwords is enabled.
122        is_password_autosave_enabled / set_password_autosave_enabled => IsPasswordAutosaveEnabled / SetIsPasswordAutosaveEnabled
123    }
124
125    settings_versioned_bool! {
126        ICoreWebView2Settings5,
127        /// Whether pinch-zoom (touch and trackpad) is enabled.
128        is_pinch_zoom_enabled / set_pinch_zoom_enabled => IsPinchZoomEnabled / SetIsPinchZoomEnabled
129    }
130
131    settings_versioned_bool! {
132        ICoreWebView2Settings6,
133        /// Whether swipe gestures navigate back and forward.
134        is_swipe_navigation_enabled / set_swipe_navigation_enabled => IsSwipeNavigationEnabled / SetIsSwipeNavigationEnabled
135    }
136
137    settings_versioned_bool! {
138        ICoreWebView2Settings9,
139        /// Whether elements styled with `app-region: drag` are treated as
140        /// draggable non-client regions, letting a custom title bar move the host
141        /// window.
142        is_non_client_region_support_enabled / set_non_client_region_support_enabled => IsNonClientRegionSupportEnabled / SetIsNonClientRegionSupportEnabled
143    }
144}