diff options
Diffstat (limited to 'js/rust/tests/rooting.rs')
-rw-r--r-- | js/rust/tests/rooting.rs | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/js/rust/tests/rooting.rs b/js/rust/tests/rooting.rs new file mode 100644 index 0000000000..868846fa02 --- /dev/null +++ b/js/rust/tests/rooting.rs @@ -0,0 +1,105 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#![cfg(feature = "debugmozjs")] + +#[macro_use] +extern crate js; +#[macro_use] +extern crate lazy_static; +extern crate libc; + +use js::jsapi::*; +use js::rust::{define_methods, Runtime, SIMPLE_GLOBAL_CLASS}; +use std::ptr; + +#[test] +fn rooting() { + unsafe { + let runtime = Runtime::new(false).unwrap(); + JS_SetGCZeal(runtime.cx(), 2, 1); + + let cx = runtime.cx(); + let h_option = JS::OnNewGlobalHookOption::FireOnNewGlobalHook; + let c_option = JS::RealmOptions::default(); + + rooted!(in(cx) let global = JS_NewGlobalObject(cx, + &SIMPLE_GLOBAL_CLASS, + ptr::null_mut(), + h_option, + &c_option)); + let _ar = js::ar::AutoRealm::with_obj(cx, global.get()); + rooted!(in(cx) let prototype_proto = JS::GetRealmObjectPrototype(cx)); + rooted!(in(cx) let proto = JS_NewObjectWithGivenProto(cx, + &CLASS as *const _, + prototype_proto.handle())); + define_methods(cx, proto.handle(), &METHODS[..]).unwrap(); + } +} + +unsafe extern "C" fn generic_method(_: *mut JSContext, _: u32, _: *mut JS::Value) -> bool { + true +} + +lazy_static! { + static ref METHODS: [JSFunctionSpec; 4] = [ + JSFunctionSpec { + name: JSFunctionSpec_Name { + string_: b"addEventListener\0" as *const u8 as *const libc::c_char, + }, + call: JSNativeWrapper { + op: Some(generic_method), + info: ptr::null() + }, + nargs: 2, + flags: JSPROP_ENUMERATE as u16, + selfHostedName: 0 as *const libc::c_char + }, + JSFunctionSpec { + name: JSFunctionSpec_Name { + string_: b"removeEventListener\0" as *const u8 as *const libc::c_char, + }, + call: JSNativeWrapper { + op: Some(generic_method), + info: ptr::null() + }, + nargs: 2, + flags: JSPROP_ENUMERATE as u16, + selfHostedName: 0 as *const libc::c_char + }, + JSFunctionSpec { + name: JSFunctionSpec_Name { + string_: b"dispatchEvent\0" as *const u8 as *const libc::c_char, + }, + call: JSNativeWrapper { + op: Some(generic_method), + info: ptr::null() + }, + nargs: 1, + flags: JSPROP_ENUMERATE as u16, + selfHostedName: 0 as *const libc::c_char + }, + JSFunctionSpec { + name: JSFunctionSpec_Name { + string_: ptr::null(), + }, + call: JSNativeWrapper { + op: None, + info: ptr::null() + }, + nargs: 0, + flags: 0, + selfHostedName: ptr::null() + } + ]; +} + +static CLASS: JSClass = JSClass { + name: b"EventTargetPrototype\0" as *const u8 as *const libc::c_char, + flags: 0, + cOps: 0 as *const _, + spec: 0 as *mut _, + ext: 0 as *mut _, + oOps: 0 as *mut _, +}; |