js_test/
object.rs

1use wasm_bindgen::prelude::*;
2
3#[wasm_bindgen]
4extern "C" {
5    type ObjectConstructor;
6
7    #[wasm_bindgen(method, structural, getter)]
8    fn prototype(this: &ObjectConstructor) -> js_sys::Object;
9
10    static Object: ObjectConstructor;
11}
12
13fn impl_is_empty_object(obj: &js_sys::Object) -> bool {
14    let keys = js_sys::Reflect::own_keys(&obj).unwrap();
15    keys.length() == 0 && {
16        let json = js_sys::JSON::stringify(&obj);
17        json == Ok(js_sys::JsString::from("{}"))
18    }
19}
20
21pub fn is_empty_object_with_object_proto(obj: &js_sys::Object) -> bool {
22    !obj.is_null()
23        && {
24            let proto = js_sys::Reflect::get_prototype_of(obj.as_ref()).unwrap();
25            proto == (&*Object).prototype()
26        }
27        && impl_is_empty_object(obj)
28}
29
30pub fn is_empty_object_with_null_proto(obj: &js_sys::Object) -> bool {
31    !obj.is_null()
32        && {
33            let proto = js_sys::Reflect::get_prototype_of(obj.as_ref()).unwrap();
34            proto.is_null()
35        }
36        && impl_is_empty_object(obj)
37}
38
39pub fn is_empty_object(obj: &js_sys::Object) -> bool {
40    is_empty_object_with_object_proto(obj) || is_empty_object_with_null_proto(obj)
41}