web: Add storage backend based on LocalStorage
This commit is contained in:
parent
8822f03fba
commit
711b202a56
|
@ -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"
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue