From 711b202a56d67b45615cdb3f7f1a5ef88671b460 Mon Sep 17 00:00:00 2001 From: CUB3D Date: Mon, 15 Jun 2020 21:55:29 +0100 Subject: [PATCH] web: Add storage backend based on LocalStorage --- web/Cargo.toml | 2 +- web/src/lib.rs | 14 +++++++++++--- web/src/storage.rs | 27 +++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 web/src/storage.rs diff --git a/web/Cargo.toml b/web/Cargo.toml index db2957733..8d7233113 100644 --- a/web/Cargo.toml +++ b/web/Cargo.toml @@ -47,7 +47,7 @@ features = [ "Element", "Event", "EventTarget", "GainNode", "HtmlCanvasElement", "HtmlElement", "HtmlImageElement", "MouseEvent", "Navigator", "Node", "Performance", "PointerEvent", "ScriptProcessorNode", "UiEvent", "Window", "Location", "HtmlFormElement", "KeyboardEvent", "Path2d", "CanvasGradient", "CanvasPattern", "SvgMatrix", "SvgsvgElement", "Response", "Request", "RequestInit", - "Blob", "BlobPropertyBag"] + "Blob", "BlobPropertyBag", "Storage"] [dev-dependencies] wasm-bindgen-test = "0.3.13" diff --git a/web/src/lib.rs b/web/src/lib.rs index d1d4d62fb..d37cc3d42 100644 --- a/web/src/lib.rs +++ b/web/src/lib.rs @@ -2,7 +2,9 @@ mod audio; mod input; mod navigator; +mod storage; +use crate::storage::LocalStorageBackend; use crate::{audio::WebAudioBackend, input::WebInputBackend, navigator::WebNavigatorBackend}; use generational_arena::{Arena, Index}; use js_sys::Uint8Array; @@ -101,7 +103,7 @@ impl Ruffle { Ok(()) } } - +use ruffle_core::backend::storage::StorageBackend; impl Ruffle { fn new_internal(parent: HtmlElement, swf_data: Uint8Array) -> Result> { console_error_panic_hook::set_once(); @@ -124,9 +126,15 @@ impl Ruffle { let audio = Box::new(WebAudioBackend::new()?); let navigator = Box::new(WebNavigatorBackend::new()); let input = Box::new(WebInputBackend::new(&canvas)); - let storage = Box::new(MemoryStorageBackend::default()); - let core = ruffle_core::Player::new(renderer, audio, navigator, input, movie, storage)?; + let local_storage = window + .local_storage() + .unwrap() + .map(|s| Box::new(LocalStorageBackend::new(s)) as Box) + .unwrap_or_else(|| Box::new(MemoryStorageBackend::default())); + + let core = + ruffle_core::Player::new(renderer, audio, navigator, input, movie, local_storage)?; let mut core_lock = core.lock().unwrap(); let frame_rate = core_lock.frame_rate(); core_lock.audio_mut().set_frame_rate(frame_rate); diff --git a/web/src/storage.rs b/web/src/storage.rs new file mode 100644 index 000000000..b045af8b8 --- /dev/null +++ b/web/src/storage.rs @@ -0,0 +1,27 @@ +use ruffle_core::backend::storage::StorageBackend; +use web_sys::Storage; + +pub struct LocalStorageBackend { + storage: Storage, +} + +impl LocalStorageBackend { + pub(crate) fn new(storage: Storage) -> Self { + LocalStorageBackend { storage } + } +} + +//TODO: scope to current url +impl StorageBackend for LocalStorageBackend { + fn get_string(&self, name: &str) -> Option { + self.storage.get(name).unwrap() + } + + fn put_string(&mut self, name: &str, value: String) -> bool { + self.storage.set(name, &value).is_ok() + } + + fn remove_key(&mut self, name: &str) { + let _ = self.storage.delete(name); + } +}