web: Add storage backend based on LocalStorage

This commit is contained in:
CUB3D 2020-06-15 21:55:29 +01:00
parent 8822f03fba
commit 711b202a56
3 changed files with 39 additions and 4 deletions

View File

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

View File

@ -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<Ruffle, Box<dyn Error>> {
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<dyn StorageBackend>)
.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);

27
web/src/storage.rs Normal file
View File

@ -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<String> {
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);
}
}