From 191e7dc1fbb814a9439416da85b5b74358ee0fda Mon Sep 17 00:00:00 2001
From: Michael Hoffmann <brennan.brisad@gmail.com>
Date: Sat, 15 Sep 2018 22:30:27 +0200
Subject: [PATCH] Add binding for Object.defineProperties()

---
 crates/js-sys/src/lib.rs           |  8 ++++++++
 crates/js-sys/tests/wasm/Object.rs | 14 ++++++++++++++
 2 files changed, 22 insertions(+)

diff --git a/crates/js-sys/src/lib.rs b/crates/js-sys/src/lib.rs
index a1e0da3d..512d0d9e 100644
--- a/crates/js-sys/src/lib.rs
+++ b/crates/js-sys/src/lib.rs
@@ -2004,6 +2004,14 @@ extern "C" {
     #[wasm_bindgen(static_method_of = Object, js_name = defineProperty)]
     pub fn define_property(obj: &Object, prop: &JsValue, descriptor: &Object) -> Object;
 
+    /// The Object.defineProperties() method defines new or modifies
+    /// existing properties directly on an object, returning the
+    /// object.
+    ///
+    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperties)
+    #[wasm_bindgen(static_method_of = Object, js_name = defineProperties)]
+    pub fn define_properties(obj: &Object, props: &Object) -> Object;
+
     /// The `Object.freeze()` method freezes an object: that is, prevents new
     /// properties from being added to it; prevents existing properties from
     /// being removed; and prevents existing properties, or their enumerability,
diff --git a/crates/js-sys/tests/wasm/Object.rs b/crates/js-sys/tests/wasm/Object.rs
index 580b0cbe..832985c3 100644
--- a/crates/js-sys/tests/wasm/Object.rs
+++ b/crates/js-sys/tests/wasm/Object.rs
@@ -87,6 +87,20 @@ fn define_property() {
     assert!(foo.has_own_property(&"bar".into()));
 }
 
+#[wasm_bindgen_test]
+fn define_properties() {
+    let props = Object::new();
+    let descriptor = DefinePropertyAttrs::from(JsValue::from(Object::new()));
+    descriptor.set_value(&42.into());
+    let descriptor = JsValue::from(descriptor);
+    Reflect::set(props.as_ref(), &JsValue::from("bar"), &descriptor);
+    Reflect::set(props.as_ref(), &JsValue::from("car"), &descriptor);
+    let foo = foo_42();
+    let foo = Object::define_properties(&foo, &props);
+    assert!(foo.has_own_property(&"bar".into()));
+    assert!(foo.has_own_property(&"car".into()));
+}
+
 #[wasm_bindgen_test]
 fn has_own_property() {
     assert!(foo_42().has_own_property(&"foo".into()));