diff --git a/src/js.rs b/src/js.rs index 1ce4d2141..ad6f80bc3 100644 --- a/src/js.rs +++ b/src/js.rs @@ -579,6 +579,46 @@ extern { pub fn value_of(this: &Object) -> Object; } +// WeakMap +#[wasm_bindgen] +extern { + pub type WeakMap; + + /// The WeakMap object is a collection of key/value pairs in which the keys are weakly referenced. + /// The keys must be objects and the values can be arbitrary values. + /// + /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap + #[wasm_bindgen(constructor)] + pub fn new() -> WeakMap; + + /// The set() method sets the value for the key in the WeakMap object. Returns + /// the WeakMap object. + /// + /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap/set + #[wasm_bindgen(method, js_class="WeakMap")] + pub fn set(this: &WeakMap, key: Object, value: JsValue) -> WeakMap; + + /// The get() method returns a specified by key element + /// from a WeakMap object. + /// + /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap/get + #[wasm_bindgen(method)] + pub fn get(this: &WeakMap, key: Object) -> JsValue; + + /// The has() method returns a boolean indicating whether an element with + /// the specified key exists in the WeakMap object or not. + /// + /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap/has + #[wasm_bindgen(method)] + pub fn has(this: &WeakMap, key: Object) -> bool; + + /// The delete() method removes the specified element from a WeakMap object. + /// + /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap/delete + #[wasm_bindgen(method)] + pub fn delete(this: &WeakMap, key: Object) -> bool; +} + // JsString #[wasm_bindgen] extern { diff --git a/tests/all/js_globals/WeakMap.rs b/tests/all/js_globals/WeakMap.rs new file mode 100644 index 000000000..94b02a6bb --- /dev/null +++ b/tests/all/js_globals/WeakMap.rs @@ -0,0 +1,154 @@ +#![allow(non_snake_case)] + +use project; + +#[test] +fn new() { + project() + .file("src/lib.rs", r#" + #![feature(proc_macro, wasm_custom_section)] + + extern crate wasm_bindgen; + use wasm_bindgen::prelude::*; + use wasm_bindgen::js; + + #[wasm_bindgen] + pub fn new_weak_map() -> js::WeakMap { + js::WeakMap::new() + } + "#) + .file("test.ts", r#" + import * as assert from "assert"; + import * as wasm from "./out"; + + export function test() { + assert.equal(typeof wasm.new_weak_map(), "object"); + } + "#) + .test() +} + + +#[test] +fn get() { + project() + .file("src/lib.rs", r#" + #![feature(proc_macro, wasm_custom_section)] + + extern crate wasm_bindgen; + use wasm_bindgen::prelude::*; + use wasm_bindgen::js; + + #[wasm_bindgen] + pub fn get_value(this: &js::WeakMap, key: js::Object) -> JsValue { + this.get(key) + } + "#) + .file("test.ts", r#" + import * as assert from "assert"; + import * as wasm from "./out"; + + export function test() { + let map = new WeakMap(); + let key = {some: "key"}; + map.set(key, "value"); + assert.equal(wasm.get_value(map, key), "value"); + + let undef = "unexisting_key"; + assert.equal(typeof wasm.get_value(map, undef), "undefined"); + } + "#) + .test() +} + +#[test] +fn set() { + project() + .file("src/lib.rs", r#" + #![feature(proc_macro, wasm_custom_section)] + + extern crate wasm_bindgen; + use wasm_bindgen::prelude::*; + use wasm_bindgen::js; + + #[wasm_bindgen] + pub fn set_value(this: &js::WeakMap, key: js::Object, value: JsValue) -> js::WeakMap { + this.set(key, value) + } + "#) + .file("test.ts", r#" + import * as assert from "assert"; + import * as wasm from "./out"; + + export function test() { + let map = new WeakMap(); + let key = {some: "key"}; + wasm.set_value(map, key, "value"); + assert.equal(map.get(key), "value"); + } + "#) + .test() +} + +#[test] +fn has() { + project() + .file("src/lib.rs", r#" + #![feature(proc_macro, wasm_custom_section)] + + extern crate wasm_bindgen; + use wasm_bindgen::prelude::*; + use wasm_bindgen::js; + + #[wasm_bindgen] + pub fn has_value(this: &js::WeakMap, key: js::Object) -> bool { + this.has(key) + } + "#) + .file("test.ts", r#" + import * as assert from "assert"; + import * as wasm from "./out"; + + export function test() { + let map = new WeakMap(); + let key = {some: "key"}; + map.set(key, "value"); + assert.equal(wasm.has_value(map, key), true); + + let undef = "unexisting_key"; + assert.equal(wasm.has_value(map, undef), false); + } + "#) + .test() +} + +#[test] +fn delete() { + project() + .file("src/lib.rs", r#" + #![feature(proc_macro, wasm_custom_section)] + + extern crate wasm_bindgen; + use wasm_bindgen::prelude::*; + use wasm_bindgen::js; + + #[wasm_bindgen] + pub fn delete_key(this: &js::WeakMap, key: js::Object) -> bool { + this.delete(key) + } + "#) + .file("test.ts", r#" + import * as assert from "assert"; + import * as wasm from "./out"; + + export function test() { + let map = new WeakMap(); + let key = {some: "key"}; + map.set(key, "value"); + assert.equal(wasm.delete_key(map, key), true); + assert.equal(map.has(key), false); + assert.equal(wasm.delete_key(map, key), false); + } + "#) + .test() +} \ No newline at end of file diff --git a/tests/all/js_globals/mod.rs b/tests/all/js_globals/mod.rs index 9427d7dc5..453c407ce 100644 --- a/tests/all/js_globals/mod.rs +++ b/tests/all/js_globals/mod.rs @@ -8,6 +8,7 @@ mod Date; mod Function; mod JsString; mod Math; +mod WeakMap; mod Number; mod Object; mod TypedArray;