Browse Source

add `use_eval()`to desktop and web

Ilya Maximov 3 years ago
parent
commit
5cbf2698fd

+ 16 - 1
packages/desktop/src/desktop_context.rs

@@ -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)
+}

+ 1 - 1
packages/desktop/src/lib.rs

@@ -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;
 

+ 2 - 0
packages/web/src/lib.rs

@@ -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.
 ///

+ 23 - 0
packages/web/src/util.rs

@@ -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.**
+///
+/// # Panics
+///
+/// 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");
+    }
+}

+ 6 - 0
src/lib.rs

@@ -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;