diff --git a/core/src/backend/navigator.rs b/core/src/backend/navigator.rs index 6fa4d07c0..b104fc9db 100644 --- a/core/src/backend/navigator.rs +++ b/core/src/backend/navigator.rs @@ -172,6 +172,9 @@ pub trait NavigatorBackend { vars_method: Option<(NavigationMethod, IndexMap)>, ); + /// Execute a JavaScript code. + fn run_script(&self, js_code: &str); + /// Fetch data at a given URL and return it some time in the future. fn fetch(&self, url: &str, request_options: RequestOptions) -> OwnedFuture, Error>; @@ -359,6 +362,8 @@ impl NavigatorBackend for NullNavigatorBackend { ) { } + fn run_script(&self, _js_code: &str) {} + fn fetch(&self, url: &str, _opts: RequestOptions) -> OwnedFuture, Error> { let mut path = self.relative_base_path.clone(); path.push(url); diff --git a/desktop/src/navigator.rs b/desktop/src/navigator.rs index 714429714..f9140d0a1 100644 --- a/desktop/src/navigator.rs +++ b/desktop/src/navigator.rs @@ -111,6 +111,8 @@ impl NavigatorBackend for ExternalNavigatorBackend { }; } + fn run_script(&self, _js_code: &str) {} + fn fetch(&self, url: &str, options: RequestOptions) -> OwnedFuture, Error> { // TODO: honor sandbox type (local-with-filesystem, local-with-network, remote, ...) let full_url = match self.movie_url.clone().join(url) { diff --git a/web/src/navigator.rs b/web/src/navigator.rs index bcec151fe..ef0138a44 100644 --- a/web/src/navigator.rs +++ b/web/src/navigator.rs @@ -43,26 +43,11 @@ impl NavigatorBackend for WebNavigatorBackend { vars_method: Option<(NavigationMethod, IndexMap)>, ) { if let Some(window) = window() { - let document = match window.document() { - Some(document) => document, - None => return, - }; - let body = match document.body() { - Some(body) => body, - None => return, - }; - - if url.trim().starts_with("javascript:") { + if let Some(url) = url.trim().strip_prefix("javascript:") { let target = window_spec.unwrap_or_else(|| "".to_string()); if target.is_empty() || target == "_self" || target == "undefined" { - let code = url.replacen("javascript:", "", 1); - - let script = document.create_element("script").unwrap(); - script.set_inner_html(&code); - - let _append = body.append_child(&script); - let _remove = body.remove_child(&script); + self.run_script(url); } } else { let window_url = if url.is_empty() { @@ -80,16 +65,24 @@ impl NavigatorBackend for WebNavigatorBackend { }; //TODO: Should we return a result for failed opens? Does Flash care? - #[allow(unused_must_use)] match (vars_method, window_spec) { (Some((navmethod, formvars)), window_spec) => { + let document = match window.document() { + Some(document) => document, + None => return, + }; + let body = match document.body() { + Some(body) => body, + None => return, + }; + let form = document .create_element("form") .unwrap() .dyn_into::() .unwrap(); - form.set_attribute( + let _ = form.set_attribute( "method", match navmethod { NavigationMethod::GET => "get", @@ -97,33 +90,33 @@ impl NavigatorBackend for WebNavigatorBackend { }, ); - form.set_attribute("action", &form_url); + let _ = form.set_attribute("action", &form_url); if let Some(target) = window_spec { - form.set_attribute("target", &target); + let _ = form.set_attribute("target", &target); } for (k, v) in formvars.iter() { let hidden = document.create_element("input").unwrap(); - hidden.set_attribute("type", "hidden"); - hidden.set_attribute("name", k); - hidden.set_attribute("value", v); + let _ = hidden.set_attribute("type", "hidden"); + let _ = hidden.set_attribute("name", k); + let _ = hidden.set_attribute("value", v); - form.append_child(&hidden); + let _ = form.append_child(&hidden); } - body.append_child(&form); - form.submit(); + let _ = body.append_child(&form); + let _ = form.submit(); } (_, Some(ref window_name)) if !window_name.is_empty() => { if !window_url.is_empty() { - window.open_with_url_and_target(&window_url, window_name); + let _ = window.open_with_url_and_target(&window_url, window_name); } } _ => { if !window_url.is_empty() { - window.location().assign(&window_url); + let _ = window.location().assign(&window_url); } } }; @@ -131,6 +124,25 @@ impl NavigatorBackend for WebNavigatorBackend { } } + fn run_script(&self, js_code: &str) { + if let Some(window) = window() { + let document = match window.document() { + Some(document) => document, + None => return, + }; + let body = match document.body() { + Some(body) => body, + None => return, + }; + + let script = document.create_element("script").unwrap(); + script.set_inner_html(&js_code); + + let _ = body.append_child(&script); + let _ = body.remove_child(&script); + } + } + fn time_since_launch(&mut self) -> Duration { let dt = self.performance.now() - self.start_time; Duration::from_millis(dt as u64)