Add .type property to WASM Memory, Table & Global r=lth

This is part of adding type reflections to the WebAssembly JS-API. This
adds a new property on the WebAssembly.Memory, WebAssembly.Table &
WebAssembly.Global objects. It exposes the current type or the object in
a format which is compatible with the constructor for type's
constructor.

Differential Revision: https://phabricator.services.mozilla.com/D90702

bugzilla-url: https://bugzilla.mozilla.org/show_bug.cgi?id=1651725
gecko-commit: dff33d0b33c8fb168966504f5562572ddec72a8e
gecko-reviewers: lth
diff --git a/wasm/jsapi/global/type.tentative.any.js b/wasm/jsapi/global/type.tentative.any.js
new file mode 100644
index 0000000..318b1ac
--- /dev/null
+++ b/wasm/jsapi/global/type.tentative.any.js
@@ -0,0 +1,64 @@
+// META: global=window,dedicatedworker,jsshell
+// META: script=/wasm/jsapi/assertions.js
+
+function assert_type(argument) {
+    const myglobal = new WebAssembly.Global(argument);
+
+    assert_equals(myglobal.type.value, argument.value);
+    assert_equals(myglobal.type.mutable, argument.mutable);
+}
+
+test(() => {
+    assert_type({ "value": "i32", "mutable": true});
+}, "i32, mutable");
+
+test(() => {
+    assert_type({ "value": "i32", "mutable": false});
+}, "i32, immutable");
+
+test(() => {
+    assert_type({ "value": "i64", "mutable": true});
+}, "i64, mutable");
+
+test(() => {
+    assert_type({ "value": "i64", "mutable": false});
+}, "i64, immutable");
+
+test(() => {
+    assert_type({ "value": "f32", "mutable": true});
+}, "f32, mutable");
+
+test(() => {
+    assert_type({ "value": "f32", "mutable": false});
+}, "f32, immutable");
+
+test(() => {
+    assert_type({ "value": "f64", "mutable": true});
+}, "f64, mutable");
+
+test(() => {
+    assert_type({ "value": "f64", "mutable": false});
+}, "f64, immutable");
+
+test(() => {
+    assert_type({"value": "externref", "mutable": true})
+}, "anyref, mutable")
+
+test(() => {
+    assert_type({"value": "externref", "mutable": false})
+}, "anyref, immutable")
+
+test(() => {
+    assert_type({"value": "funcref", "mutable": true})
+}, "funcref, mutable")
+
+test(() => {
+    assert_type({"value": "funcref", "mutable": false})
+}, "funcref, immutable")
+
+test(() => {
+    const myglobal = new WebAssembly.Global({"value": "i32", "mutable": true});
+    const propertyNames = Object.getOwnPropertyNames(myglobal.type);
+    assert_equals(propertyNames[0], "mutable");
+    assert_equals(propertyNames[1], "value");
+}, "key ordering");
diff --git a/wasm/jsapi/memory/type.tentative.any.js b/wasm/jsapi/memory/type.tentative.any.js
new file mode 100644
index 0000000..efe9e2a
--- /dev/null
+++ b/wasm/jsapi/memory/type.tentative.any.js
@@ -0,0 +1,36 @@
+// META: global=window,dedicatedworker,jsshell
+// META: script=/wasm/jsapi/assertions.js
+
+function assert_type(argument) {
+    const memory = new WebAssembly.Memory(argument);
+
+    assert_equals(memory.type.minimum, argument.minimum);
+    assert_equals(memory.type.maximum, argument.maximum);
+    if (argument.shared !== undefined) {
+        assert_equals(memory.type.shared, argument.shared);
+    }
+}
+
+test(() => {
+    assert_type({ "minimum": 0 });
+}, "Zero initial, no maximum");
+
+test(() => {
+    assert_type({ "minimum": 5 });
+}, "Non-zero initial, no maximum");
+
+test(() => {
+    assert_type({ "minimum": 0, "maximum": 0 });
+}, "Zero maximum");
+
+test(() => {
+    assert_type({ "minimum": 0, "maximum": 5 });
+}, "None-zero maximum");
+
+test(() => {
+    assert_type({ "minimum": 0, "maximum": 10,  "shared": false});
+}, "non-shared memory");
+
+test(() => {
+    assert_type({ "minimum": 0, "maximum": 10, "shared": true});
+}, "shared memory");
\ No newline at end of file