diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index b0361d6ca47..1f0e09639c8 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -6557,7 +6557,10 @@ class CGDictionary(CGThing): (name, name, varInsert(name, member.identifier.name).define())) return CGGeneric("%s\n" % insertion.define()) - memberInserts = CGList([memberInsert(m) for m in self.memberInfo]) + memberInserts = [memberInsert(m) for m in self.memberInfo] + + if d.parent: + memberInserts = [CGGeneric("self.parent.to_jsobject(cx, obj);\n")] + memberInserts selfName = self.makeClassName(d) if self.membersNeedTracing(): @@ -6602,10 +6605,16 @@ class CGDictionary(CGThing): " }\n" "}\n" "\n" + "impl ${selfName} {\n" + " pub(crate) unsafe fn to_jsobject(&self, cx: *mut JSContext, mut obj: MutableHandleObject) {\n" + "${insertMembers}" + " }\n" + "}\n" + "\n" "impl ToJSValConvertible for ${selfName} {\n" " unsafe fn to_jsval(&self, cx: *mut JSContext, mut rval: MutableHandleValue) {\n" - " rooted!(in(cx) let obj = JS_NewObject(cx, ptr::null()));\n" - "${insertMembers}" + " rooted!(in(cx) let mut obj = JS_NewObject(cx, ptr::null()));\n" + " self.to_jsobject(cx, obj.handle_mut());\n" " rval.set(ObjectOrNullValue(obj.get()))\n" " }\n" "}\n").substitute({ @@ -6614,7 +6623,7 @@ class CGDictionary(CGThing): "empty": CGIndenter(CGGeneric(self.makeEmpty()), indentLevel=4).define(), "initParent": CGIndenter(CGGeneric(initParent), indentLevel=16).define(), "initMembers": CGIndenter(memberInits, indentLevel=16).define(), - "insertMembers": CGIndenter(memberInserts, indentLevel=8).define(), + "insertMembers": CGIndenter(CGList(memberInserts), indentLevel=8).define(), "preInitial": CGIndenter(CGGeneric(preInitial), indentLevel=8).define(), "postInitial": CGIndenter(CGGeneric(postInitial), indentLevel=8).define(), }) diff --git a/components/script/dom/testbinding.rs b/components/script/dom/testbinding.rs index 3d48651901e..34c25c40449 100644 --- a/components/script/dom/testbinding.rs +++ b/components/script/dom/testbinding.rs @@ -8,6 +8,8 @@ use crate::dom::bindings::callback::ExceptionHandling; use crate::dom::bindings::codegen::Bindings::EventListenerBinding::EventListener; use crate::dom::bindings::codegen::Bindings::FunctionBinding::Function; use crate::dom::bindings::codegen::Bindings::TestBindingBinding::SimpleCallback; +use crate::dom::bindings::codegen::Bindings::TestBindingBinding::TestDictionaryParent; +use crate::dom::bindings::codegen::Bindings::TestBindingBinding::TestDictionaryWithParent; use crate::dom::bindings::codegen::Bindings::TestBindingBinding::{ TestBindingMethods, TestDictionary, }; @@ -1079,6 +1081,15 @@ impl TestBindingMethods for TestBinding { fn SemiExposedBoolFromPartialInterface(&self) -> bool { true } + + fn GetDictionaryWithParent(&self, s1: DOMString, s2: DOMString) -> TestDictionaryWithParent { + TestDictionaryWithParent { + parent: TestDictionaryParent { + parentStringMember: Some(s1), + }, + stringMember: Some(s2), + } + } } #[allow(non_snake_case)] diff --git a/components/script/dom/webidls/TestBinding.webidl b/components/script/dom/webidls/TestBinding.webidl index 482e5a3ea7e..14ab146d8be 100644 --- a/components/script/dom/webidls/TestBinding.webidl +++ b/components/script/dom/webidls/TestBinding.webidl @@ -45,6 +45,14 @@ dictionary TestDictionary { DOMString? nonRequiredNullable2; }; +dictionary TestDictionaryParent { + DOMString parentStringMember; +}; + +dictionary TestDictionaryWithParent : TestDictionaryParent { + DOMString stringMember; +}; + dictionary TestDictionaryDefaults { boolean booleanValue = false; byte byteValue = 7; @@ -571,6 +579,8 @@ interface TestBinding { [Exposed=(Window)] readonly attribute boolean semiExposedBoolFromInterface; + + TestDictionaryWithParent getDictionaryWithParent(DOMString parent, DOMString child); }; [Exposed=(Window)] diff --git a/tests/wpt/mozilla/meta-layout-2020/mozilla/dictionary_to_jsval.html.ini b/tests/wpt/mozilla/meta-layout-2020/mozilla/dictionary_to_jsval.html.ini new file mode 100644 index 00000000000..850a38abfbc --- /dev/null +++ b/tests/wpt/mozilla/meta-layout-2020/mozilla/dictionary_to_jsval.html.ini @@ -0,0 +1,2 @@ +[dictionary_to_jsval.html] + prefs: [dom.testbinding.enabled:true] diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json index fdd9f333ce5..a3ce7646dad 100644 --- a/tests/wpt/mozilla/meta/MANIFEST.json +++ b/tests/wpt/mozilla/meta/MANIFEST.json @@ -13357,6 +13357,13 @@ {} ] ], + "dictionary_to_jsval.html": [ + "e31a7e5cfaa0635d41ab2adac96318b574c58a10", + [ + null, + {} + ] + ], "documentElement.html": [ "aee3278ba84ca12a77286a1c03dbaec9fc3a7cd0", [ diff --git a/tests/wpt/mozilla/meta/mozilla/dictionary_to_jsval.html.ini b/tests/wpt/mozilla/meta/mozilla/dictionary_to_jsval.html.ini new file mode 100644 index 00000000000..850a38abfbc --- /dev/null +++ b/tests/wpt/mozilla/meta/mozilla/dictionary_to_jsval.html.ini @@ -0,0 +1,2 @@ +[dictionary_to_jsval.html] + prefs: [dom.testbinding.enabled:true] diff --git a/tests/wpt/mozilla/tests/mozilla/dictionary_to_jsval.html b/tests/wpt/mozilla/tests/mozilla/dictionary_to_jsval.html new file mode 100644 index 00000000000..e31a7e5cfaa --- /dev/null +++ b/tests/wpt/mozilla/tests/mozilla/dictionary_to_jsval.html @@ -0,0 +1,12 @@ + +
+ + +