Expand description
Wry is a Cross-platform WebView rendering library.
The webview requires a running event loop and a window type that implements HasRawWindowHandle,
or a gtk container widget if you need to support X11 and Wayland.
You can use a windowing library like tao or winit.
§Examples
This example leverages the HasRawWindowHandle and supports Windows, macOS, iOS, Android and Linux (X11 Only)
use wry::{WebViewBuilder, raw_window_handle};
let webview = WebViewBuilder::new(&window)
.with_url("https://tauri.app")
.unwrap()
.build()
.unwrap();If you also want to support Wayland too, then we recommend you use WebViewBuilderExtUnix::new_gtk on Linux.
use wry::WebViewBuilder;
#[cfg(any(
target_os = "windows",
target_os = "macos",
target_os = "ios",
target_os = "android"
))]
let builder = WebViewBuilder::new(&window);
#[cfg(not(any(
target_os = "windows",
target_os = "macos",
target_os = "ios",
target_os = "android"
)))]
let builder = {
use tao::platform::unix::WindowExtUnix;
use wry::WebViewBuilderExtUnix;
WebViewBuilder::new_gtk(&window.gtk_window())
};
let webview = builder
.with_url("https://tauri.app")
.unwrap()
.build()
.unwrap();§Child webviews
You can use WebView::new_as_child to create the webview as a child inside another window. This is supported on
macOS, Windows and Linux (X11 Only).
use wry::{WebViewBuilder, raw_window_handle};
let webview = WebViewBuilder::new_as_child(&window)
.with_url("https://tauri.app")
.unwrap()
.build()
.unwrap();§Platform Considerations
Note that on Linux, we use webkit2gtk webviews so if the windowing library doesn’t support gtk (as in winit)
you’ll need to call gtk::init before creating the webview and then call gtk::main_iteration_do alongside
your windowing library event loop.
use winit::{event_loop::EventLoop, window::Window};
use wry::WebView;
fn main() {
let event_loop = EventLoop::new().unwrap();
gtk::init().unwrap(); // <----- IMPORTANT
let window = Window::new(&event_loop).unwrap();
let webview = WebView::new(&window);
event_loop.run(|_e, _evl|{
// process winit events
// then advance gtk event loop <----- IMPORTANT
while gtk::events_pending() {
gtk::main_iteration_do(false);
}
}).unwrap();
}§Android
In order for wry to be able to create webviews on Android, there is a few requirements that your application needs to uphold:
- You need to set a few environment variables that will be used to generate the necessary kotlin
files that you need to include in your Android application for wry to function properly.
WRY_ANDROID_PACKAGE: which is the reversed domain name of your android project and the app name in snake_case, for example,com.wry.example.wry_appWRY_ANDROID_LIBRARY: for example, if your cargo project has a lib namewry_app, it will generatelibwry_app.soso you se this env var towry_appWRY_ANDROID_KOTLIN_FILES_OUT_DIR: for example,path/to/app/src/main/kotlin/com/wry/example
- Your main Android Activity needs to inherit
AppCompatActivity, preferably it should use the generatedWryActivityor inherit it. - Your Rust app needs to call
wry::android_setupfunction to setup the necessary logic to be able to create webviews later on. - Your Rust app needs to call
wry::android_binding!macro to setup the JNI functions that will be called byWryActivityand various other places.
It is recommended to use tao crate as it provides maximum compatibility with wry
#[cfg(target_os = "android")]
{
tao::android_binding!(
com_example,
wry_app,
WryActivity,
wry::android_setup, // pass the wry::android_setup function to tao which will invoke when the event loop is created
_start_app
);
wry::android_binding!(com_example, ttt);
}If this feels overwhelming, you can just use the preconfigured template from cargo-mobile2.
For more inforamtion, checkout MOBILE.md.
§Feature flags
Wry uses a set of feature flags to toggle several advanced features.
os-webview(default): Enables the default WebView framework on the platform. This must be enabled for the crate to work. This feature was added in preparation of other ports like cef and servo.protocol(default): EnablesWebViewBuilder::with_custom_protocolto define custom URL scheme for handling tasks like loading assets.file-drop(default): EnablesWebViewBuilder::with_file_drop_handlerto control the behaviour when there are files interacting with the window.devtools: Enables devtools on release builds. Devtools are always enabled in debug builds. On macOS, enabling devtools, requires calling private apis so you should not enable this flag in release build if your app needs to publish to App Store.transparent: Transparent background on macOS requires calling private functions. Avoid this in release build if your app needs to publish to App Store.fullscreen: Fullscreen video and other media on macOS requires calling private functions. Avoid this in release build if your app needs to publish to App Store. libraries and prevent from building documentation on doc.rs fails.linux-body: Enables body support of custom protocol request on Linux. Requires webkit2gtk v2.40 or above.
Re-exports§
pub use raw_window_handle;pub use http;
Structs§
- Proxy
Endpoint - Rect
- A rectangular region.
- Request
Async Responder - Resolves a custom protocol
Requestasynchronously. - Url
- A parsed URL record.
- WebContext
- A context that is shared between multiple
WebViews. - WebView
- The fundamental type to present a
WebView. - WebView
Attributes - WebView
Builder - Builder type of
WebView.
Enums§
- Error
- Errors returned by wry.
- File
Drop Event - An event describing the files drop on the webview.
- Page
Load Event - Type of of page loading event
- Proxy
Config - Theme
- WebView theme.
Traits§
- WebView
Builder ExtUnix - WebView
ExtUnix - Additional methods on
WebViewthat are specific to Linux.
Functions§
- webview_
version - Get WebView/Webkit version on current platform.