#[macro_use]
extern crate wap;
use wap::*;
use std::cell::RefCell;
wap_begin!(|window| {
let c_window = get(&window, "Window").unwrap();
assert!(wap::instanceof(&window, &c_window));
let document = get(&window, "document").unwrap();
let body = get(&document, "body").unwrap();
let _s = new_string("hello");
let _o = new_object();
set(
&body,
"innerHTML",
"
Hello World
".to_string().into(),
);
let _inner_html = get(&body, "innerHTML").unwrap_string();
set(&window, "test", JsType::Boolean(true));
delete(&window, "test");
let eval = get(&window, "eval").unwrap();
let random = call(&eval, &["Math.random".to_string().into()]).unwrap();
let random = call(&random, &[]).unwrap_number();
call(
&eval,
&[
format!(
"alert(\"Eval called.\\nOk to begin RAF loop\\n{}\");",
random
).into(),
],
);
let instance = webassembly_instance();
let exports = get(&instance, "exports").unwrap();
let fn_loop = get(&exports, "fn_loop").unwrap();
let raf = get(&window, "requestAnimationFrame").unwrap();
STATE.with(|s| {
let mut s = s.borrow_mut();
s.raf = Some(raf.clone());
s.body = Some(body);
s.fn_loop = Some(fn_loop.clone());
});
call(&raf, &[JsType::Ref(fn_loop)]);
});
struct State {
raf: Option,
fn_loop: Option,
body: Option,
count: u32,
start: f64,
last: f64,
}
thread_local! {
static STATE: RefCell = RefCell::new(State{
raf: None,
body: None,
fn_loop: None,
count: 0,
start: std::f64::NAN,
last: std::f64::NAN,
});
}
#[no_mangle]
pub extern "C" fn fn_loop(time: f64) {
STATE.with(|s| {
let mut s = s.borrow_mut();
let last = s.last;
s.last = time;
s.count += 1;
if s.count == 1 {
s.start = time;
}
let will_shutdown = if time.is_nan() || time < 10_000.0 {
call(
s.raf.as_ref().unwrap(),
&[JsType::Ref(s.fn_loop.as_ref().unwrap().clone())],
);
false
} else {
true
};
set(
s.body.as_ref().unwrap(),
"innerText",
JsType::String(
"Hello World ".to_string() + &format!("{:.3}", s.start) + " " + &s.count.to_string()
+ " " + &format!("{:.3}", time) + " "
+ &format!("{:.3}", (time - last)),
),
);
if will_shutdown {
// test if mem is freed
let big_vec = vec![0u8; 500_000_000];
s.raf = None;
s.body = None;
s.fn_loop = None;
unsafe {
shutdown();
}
std::mem::forget(big_vec);
}
});
}
fn main() {}