pub struct WebviewBuilder<R: Runtime> { /* private fields */ }unstable only.Expand description
A builder for a webview.
Implementations§
Source§impl<R: Runtime> WebviewBuilder<R>
impl<R: Runtime> WebviewBuilder<R>
Sourcepub fn new<L: Into<String>>(label: L, url: WebviewUrl) -> Self
pub fn new<L: Into<String>>(label: L, url: WebviewUrl) -> Self
Initializes a webview builder with the given webview label and URL to load.
§Known issues
On Windows, this function deadlocks when used in a synchronous command, see the Webview2 issue.
You should use async commands when creating windows.
§Examples
- Create a webview in the setup hook:
tauri::Builder::default()
.setup(|app| {
let window = tauri::window::WindowBuilder::new(app, "label").build()?;
let webview_builder = tauri::webview::WebviewBuilder::new("label", tauri::WebviewUrl::App("index.html".into()));
let webview = window.add_child(webview_builder, tauri::LogicalPosition::new(0, 0), window.inner_size().unwrap());
Ok(())
});- Create a webview in a separate thread:
tauri::Builder::default()
.setup(|app| {
let handle = app.handle().clone();
std::thread::spawn(move || {
let window = tauri::window::WindowBuilder::new(&handle, "label").build().unwrap();
let webview_builder = tauri::webview::WebviewBuilder::new("label", tauri::WebviewUrl::App("index.html".into()));
window.add_child(webview_builder, tauri::LogicalPosition::new(0, 0), window.inner_size().unwrap());
});
Ok(())
});- Create a webview in a command:
#[tauri::command]
async fn create_window(app: tauri::AppHandle) {
let window = tauri::window::WindowBuilder::new(&app, "label").build().unwrap();
let webview_builder = tauri::webview::WebviewBuilder::new("label", tauri::WebviewUrl::External("https://tauri.app/".parse().unwrap()));
window.add_child(webview_builder, tauri::LogicalPosition::new(0, 0), window.inner_size().unwrap());
}Sourcepub fn from_config(config: &WindowConfig) -> Self
pub fn from_config(config: &WindowConfig) -> Self
Initializes a webview builder from a WindowConfig from tauri.conf.json.
Keep in mind that you can’t create 2 webviews with the same label so make sure
that the initial webview was closed or change the label of the new WebviewBuilder.
§Known issues
On Windows, this function deadlocks when used in a synchronous command, see the Webview2 issue.
You should use async commands when creating webviews.
§Examples
- Create a webview in a command:
#[tauri::command]
async fn reopen_window(app: tauri::AppHandle) {
let window = tauri::window::WindowBuilder::from_config(&app, &app.config().app.windows.get(0).unwrap().clone())
.unwrap()
.build()
.unwrap();
}Sourcepub fn on_web_resource_request<F: Fn(Request<Vec<u8>>, &mut Response<Cow<'static, [u8]>>) + Send + Sync + 'static>(
self,
f: F,
) -> Self
pub fn on_web_resource_request<F: Fn(Request<Vec<u8>>, &mut Response<Cow<'static, [u8]>>) + Send + Sync + 'static>( self, f: F, ) -> Self
Defines a closure to be executed when the webview makes an HTTP request for a web resource, allowing you to modify the response.
Currently only implemented for the tauri URI protocol.
NOTE: Currently this is not executed when using external URLs such as a development server, but it might be implemented in the future. Always check the request URL.
§Examples
use tauri::{
utils::config::{Csp, CspDirectiveSources, WebviewUrl},
window::WindowBuilder,
webview::WebviewBuilder,
};
use http::header::HeaderValue;
use std::collections::HashMap;
tauri::Builder::default()
.setup(|app| {
let window = tauri::window::WindowBuilder::new(app, "label").build()?;
let webview_builder = WebviewBuilder::new("core", WebviewUrl::App("index.html".into()))
.on_web_resource_request(|request, response| {
if request.uri().scheme_str() == Some("tauri") {
// if we have a CSP header, Tauri is loading an HTML file
// for this example, let's dynamically change the CSP
if let Some(csp) = response.headers_mut().get_mut("Content-Security-Policy") {
// use the tauri helper to parse the CSP policy to a map
let mut csp_map: HashMap<String, CspDirectiveSources> = Csp::Policy(csp.to_str().unwrap().to_string()).into();
csp_map.entry("script-src".to_string()).or_insert_with(Default::default).push("'unsafe-inline'");
// use the tauri helper to get a CSP string from the map
let csp_string = Csp::from(csp_map).to_string();
*csp = HeaderValue::from_str(&csp_string).unwrap();
}
}
});
let webview = window.add_child(webview_builder, tauri::LogicalPosition::new(0, 0), window.inner_size().unwrap())?;
Ok(())
});Defines a closure to be executed when the webview navigates to a URL. Returning false cancels the navigation.
§Examples
use tauri::{
utils::config::{Csp, CspDirectiveSources, WebviewUrl},
window::WindowBuilder,
webview::WebviewBuilder,
};
use http::header::HeaderValue;
use std::collections::HashMap;
tauri::Builder::default()
.setup(|app| {
let window = tauri::window::WindowBuilder::new(app, "label").build()?;
let webview_builder = WebviewBuilder::new("core", WebviewUrl::App("index.html".into()))
.on_navigation(|url| {
// allow the production URL or localhost on dev
url.scheme() == "tauri" || (cfg!(dev) && url.host_str() == Some("localhost"))
});
let webview = window.add_child(webview_builder, tauri::LogicalPosition::new(0, 0), window.inner_size().unwrap())?;
Ok(())
});Sourcepub fn on_download<F: Fn(Webview<R>, DownloadEvent<'_>) -> bool + Send + Sync + 'static>(
self,
f: F,
) -> Self
pub fn on_download<F: Fn(Webview<R>, DownloadEvent<'_>) -> bool + Send + Sync + 'static>( self, f: F, ) -> Self
Set a download event handler to be notified when a download is requested or finished.
Returning false prevents the download from happening on a DownloadEvent::Requested event.
§Examples
use tauri::{
utils::config::{Csp, CspDirectiveSources, WebviewUrl},
window::WindowBuilder,
webview::{DownloadEvent, WebviewBuilder},
};
tauri::Builder::default()
.setup(|app| {
let window = WindowBuilder::new(app, "label").build()?;
let webview_builder = WebviewBuilder::new("core", WebviewUrl::App("index.html".into()))
.on_download(|webview, event| {
match event {
DownloadEvent::Requested { url, destination } => {
println!("downloading {}", url);
*destination = "/home/tauri/target/path".into();
}
DownloadEvent::Finished { url, path, success } => {
println!("downloaded {} to {:?}, success: {}", url, path, success);
}
_ => (),
}
// let the download start
true
});
let webview = window.add_child(webview_builder, tauri::LogicalPosition::new(0, 0), window.inner_size().unwrap())?;
Ok(())
});Sourcepub fn on_page_load<F: Fn(Webview<R>, PageLoadPayload<'_>) + Send + Sync + 'static>(
self,
f: F,
) -> Self
pub fn on_page_load<F: Fn(Webview<R>, PageLoadPayload<'_>) + Send + Sync + 'static>( self, f: F, ) -> Self
Defines a closure to be executed when a page load event is triggered.
The event can be either PageLoadEvent::Started if the page has started loading
or PageLoadEvent::Finished when the page finishes loading.
§Examples
use tauri::{
utils::config::{Csp, CspDirectiveSources, WebviewUrl},
window::WindowBuilder,
webview::{PageLoadEvent, WebviewBuilder},
};
use http::header::HeaderValue;
use std::collections::HashMap;
tauri::Builder::default()
.setup(|app| {
let window = tauri::window::WindowBuilder::new(app, "label").build()?;
let webview_builder = WebviewBuilder::new("core", WebviewUrl::App("index.html".into()))
.on_page_load(|webview, payload| {
match payload.event() {
PageLoadEvent::Started => {
println!("{} finished loading", payload.url());
}
PageLoadEvent::Finished => {
println!("{} finished loading", payload.url());
}
}
});
let webview = window.add_child(webview_builder, tauri::LogicalPosition::new(0, 0), window.inner_size().unwrap())?;
Ok(())
});Source§impl<R: Runtime> WebviewBuilder<R>
Webview attributes.
impl<R: Runtime> WebviewBuilder<R>
Webview attributes.
Sourcepub fn accept_first_mouse(self, accept: bool) -> Self
pub fn accept_first_mouse(self, accept: bool) -> Self
Sets whether clicking an inactive window also clicks through to the webview.
Sourcepub fn initialization_script(self, script: &str) -> Self
pub fn initialization_script(self, script: &str) -> Self
Adds the provided JavaScript to a list of scripts that should be run after the global object has been created, but before the HTML document has been parsed and before any other script included by the HTML document is run.
Since it runs on all top-level document and child frame page navigations,
it’s recommended to check the window.location to guard your script from running on unexpected origins.
§Examples
use tauri::{WindowBuilder, Runtime};
const INIT_SCRIPT: &str = r#"
if (window.location.origin === 'https://tauri.app') {
console.log("hello world from js init script");
window.__MY_CUSTOM_PROPERTY__ = { foo: 'bar' };
}
"#;
fn main() {
tauri::Builder::default()
.setup(|app| {
let window = tauri::window::WindowBuilder::new(app, "label").build()?;
let webview_builder = tauri::webview::WebviewBuilder::new("label", tauri::WebviewUrl::App("index.html".into()))
.initialization_script(INIT_SCRIPT);
let webview = window.add_child(webview_builder, tauri::LogicalPosition::new(0, 0), window.inner_size().unwrap())?;
Ok(())
});
}Sourcepub fn user_agent(self, user_agent: &str) -> Self
pub fn user_agent(self, user_agent: &str) -> Self
Set the user agent for the webview
Sourcepub fn additional_browser_args(self, additional_args: &str) -> Self
pub fn additional_browser_args(self, additional_args: &str) -> Self
Sourcepub fn data_directory(self, data_directory: PathBuf) -> Self
pub fn data_directory(self, data_directory: PathBuf) -> Self
Data directory for the webview.
Sourcepub fn disable_drag_drop_handler(self) -> Self
pub fn disable_drag_drop_handler(self) -> Self
Disables the drag and drop handler. This is required to use HTML5 drag and drop APIs on the frontend on Windows.
Sourcepub fn enable_clipboard_access(self) -> Self
pub fn enable_clipboard_access(self) -> Self
Enables clipboard access for the page rendered on Linux and Windows.
macOS doesn’t provide such method and is always enabled by default, but you still need to add menu item accelerators to use shortcuts.
Sourcepub fn proxy_url(self, url: Url) -> Self
pub fn proxy_url(self, url: Url) -> Self
Set a proxy URL for the WebView for all network requests.
Must be either a http:// or a socks5:// URL.
§Platform-specific
- macOS: Requires the
macos-proxyfeature flag and only compiles for macOS 14+.
Sourcepub fn transparent(self, transparent: bool) -> Self
Available on non-macOS or crate feature macos-private-api only.
pub fn transparent(self, transparent: bool) -> Self
macos-private-api only.Enable or disable transparency for the WebView.
Sourcepub fn auto_resize(self) -> Self
pub fn auto_resize(self) -> Self
Sets the webview to automatically grow and shrink its size and position when the parent window resizes.
Sourcepub fn zoom_hotkeys_enabled(self, enabled: bool) -> Self
pub fn zoom_hotkeys_enabled(self, enabled: bool) -> Self
Whether page zooming by hotkeys is enabled
§Platform-specific:
-
Windows: Controls WebView2’s
IsZoomControlEnabledsetting. -
MacOS / Linux: Injects a polyfill that zooms in and out with
ctrl/command+-/=, 20% in each step, ranging from 20% to 1000%. Requireswebview:allow-set-webview-zoompermission -
Android / iOS: Unsupported.
Sourcepub fn browser_extensions_enabled(self, enabled: bool) -> Self
pub fn browser_extensions_enabled(self, enabled: bool) -> Self
Whether browser extensions can be installed for the webview process
§Platform-specific:
- Windows: Enables the WebView2 environment’s
AreBrowserExtensionsEnabled - MacOS / Linux / iOS / Android - Unsupported.
Sourcepub fn extensions_path(self, path: impl AsRef<Path>) -> Self
pub fn extensions_path(self, path: impl AsRef<Path>) -> Self
Set the path from which to load extensions from. Extensions stored in this path should be unpacked Chrome extensions on Windows, and compiled .so extensions on Linux.
§Platform-specific:
- Windows: Browser extensions must first be enabled. See
browser_extensions_enabled - MacOS / iOS / Android - Unsupported.
Sourcepub fn data_store_identifier(self, data_store_identifier: [u8; 16]) -> Self
pub fn data_store_identifier(self, data_store_identifier: [u8; 16]) -> Self
Initialize the WebView with a custom data store identifier. Can be used as a replacement for data_directory not being available in WKWebView.
- macOS / iOS: Available on macOS >= 14 and iOS >= 17
- Windows / Linux / Android: Unsupported.
Sourcepub fn use_https_scheme(self, enabled: bool) -> Self
pub fn use_https_scheme(self, enabled: bool) -> Self
Sets whether the custom protocols should use https://<scheme>.localhost instead of the default http://<scheme>.localhost on Windows and Android. Defaults to false.
§Note
Using a https scheme will NOT allow mixed content when trying to fetch http endpoints and therefore will not match the behavior of the <scheme>://localhost protocols used on macOS and Linux.
§Warning
Changing this value between releases will change the IndexedDB, cookies and localstorage location and your app will not be able to access the old data.
Sourcepub fn devtools(self, enabled: bool) -> Self
pub fn devtools(self, enabled: bool) -> Self
Whether web inspector, which is usually called browser devtools, is enabled or not. Enabled by default.
This API works in debug builds, but requires devtools feature flag to enable it in release builds.
§Platform-specific
- macOS: This will call private functions on macOS
- Android: Open
chrome://inspect/#devicesin Chrome to get the devtools window. Wry’sWebViewdevtools API isn’t supported on Android. - iOS: Open Safari > Develop > [Your Device Name] > [Your WebView] to get the devtools window.
Sourcepub fn background_color(self, color: Color) -> Self
pub fn background_color(self, color: Color) -> Self
Set the webview background color.
§Platform-specific:
- macOS / iOS: Not implemented.
- Windows: On Windows 7, alpha channel is ignored.
- Windows: On Windows 8 and newer, if alpha channel is not
0, it will be ignored.