@@ -193,6 +193,21 @@ pub(super) fn handler(
DevTool => webview.devtool(),
- Eval(code) => webview.evaluate_script(code.as_str()).expect("failed to eval script"),
+ Eval(code) => webview
+ .evaluate_script(code.as_str())
+ .expect("failed to eval script"),
}
+
+/// Get a closure that executes any JavaScript in the WebView context.
+///
+/// # Panics
+/// The closure will cause the message processing thread to panic if the
+/// provided script is not valid JavaScript code or if it returns an uncaught
+/// error.
+pub fn use_eval<S: std::fmt::Display>(cx: &ScopeState) -> impl Fn(S) + '_ {
+ let desktop = use_window(&cx);
+ move |script| desktop.eval(script)
+}
@@ -11,7 +11,7 @@ mod events;
mod protocol;
use desktop_context::UserWindowEvent;
-pub use desktop_context::{use_window, DesktopContext};
+pub use desktop_context::{use_window, use_eval, DesktopContext};
pub use wry;
pub use wry::application as tao;
@@ -62,12 +62,14 @@ use dioxus::VirtualDom;
pub use dioxus_core as dioxus;
use dioxus_core::prelude::Component;
use futures_util::FutureExt;
+pub use crate::util::use_eval;
mod cache;
mod cfg;
mod dom;
mod rehydrate;
mod ric_raf;
+mod util;
/// Launch the VirtualDOM given a root component and a configuration.
///
@@ -1 +1,24 @@
//! Utilities specific to websys
+use dioxus_core::*;
+/// Get a closure that executes any JavaScript in the webpage.
+/// # Safety
+/// Please be very careful with this function. A script with too many dynamic
+/// parts is practically asking for a hacker to find an XSS vulnerability in
+/// it. **This applies especially to web targets, where the JavaScript context
+/// has access to most, if not all of your application data.**
+/// The closure will panic if the provided script is not valid JavaScript code
+/// or if it returns an uncaught error.
+pub fn use_eval<S: std::fmt::Display>(_cx: &ScopeState) -> impl Fn(S) {
+ |script| {
+ js_sys::Function::new_no_args(&script.to_string())
+ .call0(&wasm_bindgen::JsValue::NULL)
+ .expect("failed to eval script");
+ }
@@ -44,3 +44,9 @@ pub mod prelude {
#[cfg(feature = "fermi")]
pub use fermi::{use_atom_ref, use_init_atom_root, use_read, use_set, Atom, AtomRef};
+#[cfg(all(target = "wasm", feature = "web"))]
+pub use dioxus_web::use_eval;
+#[cfg(all(not(target = "wasm"), feature = "desktop"))]
+pub use dioxus_desktop::use_eval;