From 8d83bbb864609c6c52a4a8a7a2a13f2a2982574d Mon Sep 17 00:00:00 2001 From: David Wendt Date: Fri, 8 Nov 2019 21:10:21 -0500 Subject: [PATCH] Impl fetch for web --- web/Cargo.toml | 2 +- web/src/navigator.rs | 27 +++++++++++++++++++++++---- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/web/Cargo.toml b/web/Cargo.toml index df9c68892..e147ba593 100644 --- a/web/Cargo.toml +++ b/web/Cargo.toml @@ -42,7 +42,7 @@ features = [ "AudioNode", "CanvasRenderingContext2d", "ChannelMergerNode", "ChannelSplitterNode", "CssStyleDeclaration", "Document", "Element", "Event", "EventTarget", "GainNode", "HtmlCanvasElement", "HtmlElement", "HtmlImageElement", "MouseEvent", "Navigator", "Node", "Performance", "PointerEvent", "ScriptProcessorNode", "UiEvent", "Window", "Location", "HtmlFormElement", - "KeyboardEvent", "Path2d", "CanvasGradient", "CanvasPattern", "SvgMatrix", "SvgsvgElement"] + "KeyboardEvent", "Path2d", "CanvasGradient", "CanvasPattern", "SvgMatrix", "SvgsvgElement", "Response"] [dev-dependencies] wasm-bindgen-test = "0.3.7" diff --git a/web/src/navigator.rs b/web/src/navigator.rs index 5933a5204..1ac743c8d 100644 --- a/web/src/navigator.rs +++ b/web/src/navigator.rs @@ -1,12 +1,13 @@ //! Navigator backend for web +use js_sys::{ArrayBuffer, Uint8Array}; use ruffle_core::backend::navigator::{Error, NavigationMethod, NavigatorBackend}; use std::collections::HashMap; use std::future::Future; use std::pin::Pin; use wasm_bindgen::JsCast; -use wasm_bindgen_futures::spawn_local; -use web_sys::window; +use wasm_bindgen_futures::{spawn_local, JsFuture}; +use web_sys::{window, Response}; pub struct WebNavigatorBackend {} @@ -76,8 +77,26 @@ impl NavigatorBackend for WebNavigatorBackend { } } - fn fetch(&self, _url: String) -> Pin, Error>>>> { - Box::pin(async { Ok(Vec::new()) }) + fn fetch(&self, url: String) -> Pin, Error>>>> { + Box::pin(async move { + let window = web_sys::window().unwrap(); + let fetchval = JsFuture::from(window.fetch_with_str(&url)).await; + if fetchval.is_err() { + return Err("Could not fetch, got JS Error".into()); + } + + let resp: Response = fetchval.unwrap().dyn_into().unwrap(); + let data: ArrayBuffer = JsFuture::from(resp.array_buffer().unwrap()) + .await + .unwrap() + .dyn_into() + .unwrap(); + let jsarray = Uint8Array::new(&data); + let mut rust_array = vec![0; jsarray.length() as usize]; + jsarray.copy_to(&mut rust_array); + + Ok(rust_array) + }) } fn spawn_future(&mut self, future: Pin + 'static>>) {