зеркало из https://github.com/mozilla/gecko-dev.git
106 строки
3.4 KiB
Rust
106 строки
3.4 KiB
Rust
/* 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 _,
|
|
};
|