From b697621b05d5c0b741d377637cb9c16ef31986b9 Mon Sep 17 00:00:00 2001 From: Kagami Sascha Rosylight Date: Tue, 15 Oct 2019 17:14:00 +0900 Subject: [PATCH] Support WebIDL `record<>` --- .../dom/bindings/codegen/CodegenRust.py | 37 +++- components/script/dom/bindings/mod.rs | 2 +- components/script/dom/bindings/mozmap.rs | 135 ------------ components/script/dom/bindings/record.rs | 199 ++++++++++++++++++ components/script/dom/bindings/str.rs | 2 +- components/script/dom/headers.rs | 6 +- components/script/dom/request.rs | 11 +- components/script/dom/testbinding.rs | 80 ++++--- components/script/dom/webidls/Headers.webidl | 2 +- .../script/dom/webidls/TestBinding.webidl | 58 ++--- .../fetch/api/headers/headers-record.html.ini | 29 --- .../urlsearchparams-constructor.any.js.ini | 8 - 12 files changed, 318 insertions(+), 251 deletions(-) delete mode 100644 components/script/dom/bindings/mozmap.rs create mode 100644 components/script/dom/bindings/record.rs delete mode 100644 tests/wpt/metadata/fetch/api/headers/headers-record.html.ini delete mode 100644 tests/wpt/metadata/url/urlsearchparams-constructor.any.js.ini diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index 103450f78f37..01b7fc698ba5 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -77,14 +77,13 @@ def innerContainerType(type): def wrapInNativeContainerType(type, inner): if type.isSequence(): - containerType = "Vec" + return CGWrapper(inner, pre="Vec<", post=">") elif type.isRecord(): - containerType = "MozMap" + key = type.inner.keyType if type.nullable() else type.keyType + return CGRecord(key, inner) else: raise TypeError("Unexpected container type %s", type) - return CGWrapper(inner, pre=containerType + "<", post=">") - builtinNames = { IDLType.Tags.bool: 'bool', @@ -1905,6 +1904,30 @@ def define(self): return self.pre + defn + self.post +class CGRecord(CGThing): + """ + CGThing that wraps value CGThing in record with key type equal to keyType parameter + """ + def __init__(self, keyType, value): + CGThing.__init__(self) + assert keyType.isString() + self.keyType = keyType + self.value = value + + def define(self): + if self.keyType.isByteString(): + keyDef = "ByteString" + elif self.keyType.isDOMString(): + keyDef = "DOMString" + elif self.keyType.isUSVString(): + keyDef = "USVString" + else: + assert False + + defn = keyDef + ", " + self.value.define() + return "Record<" + defn + ">" + + class CGImports(CGWrapper): """ Generates the appropriate import/use statements. @@ -2024,7 +2047,7 @@ def removeWrapperAndNullableTypes(types): extras += [descriptor.path, descriptor.bindingPath] parentName = descriptor.getParentName() elif t.isType() and t.isRecord(): - extras += ['crate::dom::bindings::mozmap::MozMap'] + extras += ['crate::dom::bindings::record::Record'] elif isinstance(t, IDLPromiseType): extras += ['crate::dom::promise::Promise'] else: @@ -2373,7 +2396,7 @@ def UnionTypes(descriptors, dictionaries, callbacks, typedefs, config): 'crate::dom::bindings::conversions::StringificationBehavior', 'crate::dom::bindings::conversions::root_from_handlevalue', 'std::ptr::NonNull', - 'crate::dom::bindings::mozmap::MozMap', + 'crate::dom::bindings::record::Record', 'crate::dom::bindings::num::Finite', 'crate::dom::bindings::root::DomRoot', 'crate::dom::bindings::str::ByteString', @@ -6054,7 +6077,7 @@ def generate_imports(config, cgthings, descriptors, callbacks=None, dictionaries 'crate::dom::bindings::proxyhandler::ensure_expando_object', 'crate::dom::bindings::proxyhandler::fill_property_descriptor', 'crate::dom::bindings::proxyhandler::get_expando_object', - 'crate::dom::bindings::mozmap::MozMap', + 'crate::dom::bindings::record::Record', 'std::ptr::NonNull', 'crate::dom::bindings::num::Finite', 'crate::dom::bindings::str::ByteString', diff --git a/components/script/dom/bindings/mod.rs b/components/script/dom/bindings/mod.rs index c6759edb3602..48ee7674c92a 100644 --- a/components/script/dom/bindings/mod.rs +++ b/components/script/dom/bindings/mod.rs @@ -143,10 +143,10 @@ pub mod htmlconstructor; pub mod inheritance; pub mod interface; pub mod iterable; -pub mod mozmap; pub mod namespace; pub mod num; pub mod proxyhandler; +pub mod record; pub mod refcounted; pub mod reflector; pub mod root; diff --git a/components/script/dom/bindings/mozmap.rs b/components/script/dom/bindings/mozmap.rs deleted file mode 100644 index f5961e5bdda7..000000000000 --- a/components/script/dom/bindings/mozmap.rs +++ /dev/null @@ -1,135 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ - -//! The `MozMap` (open-ended dictionary) type. - -use crate::dom::bindings::conversions::jsid_to_string; -use crate::dom::bindings::error::report_pending_exception; -use crate::dom::bindings::str::DOMString; -use indexmap::IndexMap; -use js::conversions::{ConversionResult, FromJSValConvertible, ToJSValConvertible}; -use js::jsapi::JSContext; -use js::jsapi::JS_NewPlainObject; -use js::jsapi::JSITER_HIDDEN; -use js::jsapi::JSITER_OWNONLY; -use js::jsapi::JSITER_SYMBOLS; -use js::jsapi::JSPROP_ENUMERATE; -use js::jsval::ObjectValue; -use js::jsval::UndefinedValue; -use js::rust::wrappers::GetPropertyKeys; -use js::rust::wrappers::JS_DefineUCProperty2; -use js::rust::wrappers::JS_GetPropertyById; -use js::rust::HandleValue; -use js::rust::IdVector; -use js::rust::MutableHandleValue; -use std::ops::Deref; - -/// The `MozMap` (open-ended dictionary) type. -#[derive(Clone, JSTraceable)] -pub struct MozMap { - map: IndexMap, -} - -impl MozMap { - /// Create an empty `MozMap`. - pub fn new() -> Self { - MozMap { - map: IndexMap::new(), - } - } -} - -impl Deref for MozMap { - type Target = IndexMap; - - fn deref(&self) -> &IndexMap { - &self.map - } -} - -impl FromJSValConvertible for MozMap -where - T: FromJSValConvertible, - C: Clone, -{ - type Config = C; - unsafe fn from_jsval( - cx: *mut JSContext, - value: HandleValue, - config: C, - ) -> Result, ()> { - if !value.is_object() { - return Ok(ConversionResult::Failure( - "MozMap value was not an object".into(), - )); - } - - rooted!(in(cx) let object = value.to_object()); - let ids = IdVector::new(cx); - if !GetPropertyKeys( - cx, - object.handle(), - JSITER_OWNONLY | JSITER_HIDDEN | JSITER_SYMBOLS, - ids.get(), - ) { - // TODO: can GetPropertyKeys fail? - // (it does so if the object has duplicate keys) - // https://github.com/servo/servo/issues/21462 - report_pending_exception(cx, false); - return Ok(ConversionResult::Failure( - "Getting MozMap value property keys failed".into(), - )); - } - - let mut map = IndexMap::new(); - for id in &*ids { - rooted!(in(cx) let id = *id); - - rooted!(in(cx) let mut property = UndefinedValue()); - if !JS_GetPropertyById(cx, object.handle(), id.handle(), property.handle_mut()) { - return Err(()); - } - - let property = match T::from_jsval(cx, property.handle(), config.clone())? { - ConversionResult::Success(property) => property, - ConversionResult::Failure(message) => { - return Ok(ConversionResult::Failure(message)) - }, - }; - - // TODO: Is this guaranteed to succeed? - // https://github.com/servo/servo/issues/21463 - if let Some(key) = jsid_to_string(cx, id.handle()) { - map.insert(key, property); - } - } - - Ok(ConversionResult::Success(MozMap { map: map })) - } -} - -impl ToJSValConvertible for MozMap { - #[inline] - unsafe fn to_jsval(&self, cx: *mut JSContext, mut rval: MutableHandleValue) { - rooted!(in(cx) let js_object = JS_NewPlainObject(cx)); - assert!(!js_object.handle().is_null()); - - rooted!(in(cx) let mut js_value = UndefinedValue()); - for (key, value) in &self.map { - let key = key.encode_utf16().collect::>(); - value.to_jsval(cx, js_value.handle_mut()); - - assert!(JS_DefineUCProperty2( - cx, - js_object.handle(), - key.as_ptr(), - key.len(), - js_value.handle(), - JSPROP_ENUMERATE as u32 - )); - } - - rval.set(ObjectValue(js_object.handle().get())); - } -} diff --git a/components/script/dom/bindings/record.rs b/components/script/dom/bindings/record.rs new file mode 100644 index 000000000000..86453b59fc30 --- /dev/null +++ b/components/script/dom/bindings/record.rs @@ -0,0 +1,199 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +//! The `Record` (open-ended dictionary) type. + +use crate::dom::bindings::conversions::jsid_to_string; +use crate::dom::bindings::str::{ByteString, DOMString, USVString}; +use indexmap::IndexMap; +use js::conversions::{ConversionResult, FromJSValConvertible, ToJSValConvertible}; +use js::jsapi::HandleId as RawHandleId; +use js::jsapi::JSContext; +use js::jsapi::JS_NewPlainObject; +use js::jsapi::PropertyDescriptor; +use js::jsapi::JSITER_HIDDEN; +use js::jsapi::JSITER_OWNONLY; +use js::jsapi::JSITER_SYMBOLS; +use js::jsapi::JSPROP_ENUMERATE; +use js::jsval::ObjectValue; +use js::jsval::UndefinedValue; +use js::rust::wrappers::GetPropertyKeys; +use js::rust::wrappers::JS_DefineUCProperty2; +use js::rust::wrappers::JS_GetOwnPropertyDescriptorById; +use js::rust::wrappers::JS_GetPropertyById; +use js::rust::wrappers::JS_IdToValue; +use js::rust::HandleId; +use js::rust::HandleValue; +use js::rust::IdVector; +use js::rust::MutableHandleValue; +use std::cmp::Eq; +use std::hash::Hash; +use std::marker::Sized; +use std::ops::Deref; + +pub trait RecordKey: Eq + Hash + Sized { + fn to_utf16_vec(&self) -> Vec; + unsafe fn from_id(cx: *mut JSContext, id: HandleId) -> Result, ()>; +} + +impl RecordKey for DOMString { + fn to_utf16_vec(&self) -> Vec { + self.encode_utf16().collect::>() + } + + unsafe fn from_id(cx: *mut JSContext, id: HandleId) -> Result, ()> { + match jsid_to_string(cx, id) { + Some(s) => Ok(ConversionResult::Success(s)), + None => Ok(ConversionResult::Failure("Failed to get DOMString".into())), + } + } +} + +impl RecordKey for USVString { + fn to_utf16_vec(&self) -> Vec { + self.0.encode_utf16().collect::>() + } + + unsafe fn from_id(cx: *mut JSContext, id: HandleId) -> Result, ()> { + rooted!(in(cx) let mut jsid_value = UndefinedValue()); + let raw_id: RawHandleId = id.into(); + JS_IdToValue(cx, *raw_id.ptr, jsid_value.handle_mut()); + + USVString::from_jsval(cx, jsid_value.handle(), ()) + } +} + +impl RecordKey for ByteString { + fn to_utf16_vec(&self) -> Vec { + self.iter().map(|&x| x as u16).collect::>() + } + + unsafe fn from_id(cx: *mut JSContext, id: HandleId) -> Result, ()> { + rooted!(in(cx) let mut jsid_value = UndefinedValue()); + let raw_id: RawHandleId = id.into(); + JS_IdToValue(cx, *raw_id.ptr, jsid_value.handle_mut()); + + ByteString::from_jsval(cx, jsid_value.handle(), ()) + } +} + +/// The `Record` (open-ended dictionary) type. +#[derive(Clone, JSTraceable)] +pub struct Record { + map: IndexMap, +} + +impl Record { + /// Create an empty `Record`. + pub fn new() -> Self { + Record { + map: IndexMap::new(), + } + } +} + +impl Deref for Record { + type Target = IndexMap; + + fn deref(&self) -> &IndexMap { + &self.map + } +} + +impl FromJSValConvertible for Record +where + K: RecordKey, + V: FromJSValConvertible, + C: Clone, +{ + type Config = C; + unsafe fn from_jsval( + cx: *mut JSContext, + value: HandleValue, + config: C, + ) -> Result, ()> { + if !value.is_object() { + return Ok(ConversionResult::Failure( + "Record value was not an object".into(), + )); + } + + rooted!(in(cx) let object = value.to_object()); + let ids = IdVector::new(cx); + if !GetPropertyKeys( + cx, + object.handle(), + JSITER_OWNONLY | JSITER_HIDDEN | JSITER_SYMBOLS, + ids.get(), + ) { + return Err(()); + } + + let mut map = IndexMap::new(); + for id in &*ids { + rooted!(in(cx) let id = *id); + rooted!(in(cx) let mut desc = PropertyDescriptor::default()); + + if !JS_GetOwnPropertyDescriptorById(cx, object.handle(), id.handle(), desc.handle_mut()) + { + return Err(()); + } + + if (JSPROP_ENUMERATE as u32) & desc.attrs == 0 { + continue; + } + + let key = match K::from_id(cx, id.handle())? { + ConversionResult::Success(key) => key, + ConversionResult::Failure(message) => { + return Ok(ConversionResult::Failure(message)) + }, + }; + + rooted!(in(cx) let mut property = UndefinedValue()); + if !JS_GetPropertyById(cx, object.handle(), id.handle(), property.handle_mut()) { + return Err(()); + } + + let property = match V::from_jsval(cx, property.handle(), config.clone())? { + ConversionResult::Success(property) => property, + ConversionResult::Failure(message) => { + return Ok(ConversionResult::Failure(message)) + }, + }; + map.insert(key, property); + } + + Ok(ConversionResult::Success(Record { map: map })) + } +} + +impl ToJSValConvertible for Record +where + K: RecordKey, + V: ToJSValConvertible, +{ + #[inline] + unsafe fn to_jsval(&self, cx: *mut JSContext, mut rval: MutableHandleValue) { + rooted!(in(cx) let js_object = JS_NewPlainObject(cx)); + assert!(!js_object.handle().is_null()); + + rooted!(in(cx) let mut js_value = UndefinedValue()); + for (key, value) in &self.map { + let key = key.to_utf16_vec(); + value.to_jsval(cx, js_value.handle_mut()); + + assert!(JS_DefineUCProperty2( + cx, + js_object.handle(), + key.as_ptr(), + key.len(), + js_value.handle(), + JSPROP_ENUMERATE as u32 + )); + } + + rval.set(ObjectValue(js_object.handle().get())); + } +} diff --git a/components/script/dom/bindings/str.rs b/components/script/dom/bindings/str.rs index ad4ce8bc6217..38091fcf19ec 100644 --- a/components/script/dom/bindings/str.rs +++ b/components/script/dom/bindings/str.rs @@ -74,7 +74,7 @@ impl ops::Deref for ByteString { /// A string that is constructed from a UCS-2 buffer by replacing invalid code /// points with the replacement character. -#[derive(Clone, Default, Eq, MallocSizeOf, Ord, PartialEq, PartialOrd)] +#[derive(Clone, Default, Eq, Hash, MallocSizeOf, Ord, PartialEq, PartialOrd)] pub struct USVString(pub String); impl Borrow for USVString { diff --git a/components/script/dom/headers.rs b/components/script/dom/headers.rs index 2f2af810df8a..017cde9268a0 100644 --- a/components/script/dom/headers.rs +++ b/components/script/dom/headers.rs @@ -215,11 +215,9 @@ impl Headers { } Ok(()) }, - Some(HeadersInit::StringByteStringRecord(m)) => { + Some(HeadersInit::ByteStringByteStringRecord(m)) => { for (key, value) in m.iter() { - let key_vec = key.as_ref().to_string().into(); - let headers_key = ByteString::new(key_vec); - self.Append(headers_key, value.clone())?; + self.Append(key.clone(), value.clone())?; } Ok(()) }, diff --git a/components/script/dom/request.rs b/components/script/dom/request.rs index b777dd0cb56d..5393288c6335 100644 --- a/components/script/dom/request.rs +++ b/components/script/dom/request.rs @@ -311,9 +311,10 @@ impl Request { init_sequence.clone(), )))?; }, - &HeadersInit::StringByteStringRecord(ref init_map) => { - headers_copy - .fill(Some(HeadersInit::StringByteStringRecord(init_map.clone())))?; + &HeadersInit::ByteStringByteStringRecord(ref init_map) => { + headers_copy.fill(Some(HeadersInit::ByteStringByteStringRecord( + init_map.clone(), + )))?; }, } } @@ -859,8 +860,8 @@ impl Clone for HeadersInit { &HeadersInit::ByteStringSequenceSequence(ref b) => { HeadersInit::ByteStringSequenceSequence(b.clone()) }, - &HeadersInit::StringByteStringRecord(ref m) => { - HeadersInit::StringByteStringRecord(m.clone()) + &HeadersInit::ByteStringByteStringRecord(ref m) => { + HeadersInit::ByteStringByteStringRecord(m.clone()) }, } } diff --git a/components/script/dom/testbinding.rs b/components/script/dom/testbinding.rs index 607c97085f19..31972afe9481 100644 --- a/components/script/dom/testbinding.rs +++ b/components/script/dom/testbinding.rs @@ -36,8 +36,8 @@ use crate::dom::bindings::codegen::UnionTypes::{ StringOrUnsignedLong, StringSequenceOrUnsignedLong, }; use crate::dom::bindings::error::{Error, Fallible}; -use crate::dom::bindings::mozmap::MozMap; use crate::dom::bindings::num::Finite; +use crate::dom::bindings::record::Record; use crate::dom::bindings::refcounted::TrustedPromise; use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; use crate::dom::bindings::root::DomRoot; @@ -894,50 +894,64 @@ impl TestBindingMethods for TestBinding { fn FuncControlledMethodDisabled(&self) {} fn FuncControlledMethodEnabled(&self) {} - fn PassMozMap(&self, _: MozMap) {} - fn PassNullableMozMap(&self, _: Option>) {} - fn PassMozMapOfNullableInts(&self, _: MozMap>) {} - fn PassOptionalMozMapOfNullableInts(&self, _: Option>>) {} - fn PassOptionalNullableMozMapOfNullableInts(&self, _: Option>>>) {} - fn PassCastableObjectMozMap(&self, _: MozMap>) {} - fn PassNullableCastableObjectMozMap(&self, _: MozMap>>) {} - fn PassCastableObjectNullableMozMap(&self, _: Option>>) {} - fn PassNullableCastableObjectNullableMozMap( + fn PassRecord(&self, _: Record) {} + fn PassRecordWithUSVStringKey(&self, _: Record) {} + fn PassRecordWithByteStringKey(&self, _: Record) {} + fn PassNullableRecord(&self, _: Option>) {} + fn PassRecordOfNullableInts(&self, _: Record>) {} + fn PassOptionalRecordOfNullableInts(&self, _: Option>>) {} + fn PassOptionalNullableRecordOfNullableInts( &self, - _: Option>>>, + _: Option>>>, ) { } - fn PassOptionalMozMap(&self, _: Option>) {} - fn PassOptionalNullableMozMap(&self, _: Option>>) {} - fn PassOptionalNullableMozMapWithDefaultValue(&self, _: Option>) {} - fn PassOptionalObjectMozMap(&self, _: Option>>) {} - fn PassStringMozMap(&self, _: MozMap) {} - fn PassByteStringMozMap(&self, _: MozMap) {} - fn PassMozMapOfMozMaps(&self, _: MozMap>) {} - fn PassMozMapUnion(&self, _: UnionTypes::LongOrStringByteStringRecord) {} - fn PassMozMapUnion2(&self, _: UnionTypes::TestBindingOrStringByteStringRecord) {} - fn PassMozMapUnion3( + fn PassCastableObjectRecord(&self, _: Record>) {} + fn PassNullableCastableObjectRecord(&self, _: Record>>) { + } + fn PassCastableObjectNullableRecord(&self, _: Option>>) { + } + fn PassNullableCastableObjectNullableRecord( + &self, + _: Option>>>, + ) { + } + fn PassOptionalRecord(&self, _: Option>) {} + fn PassOptionalNullableRecord(&self, _: Option>>) {} + fn PassOptionalNullableRecordWithDefaultValue(&self, _: Option>) {} + fn PassOptionalObjectRecord(&self, _: Option>>) {} + fn PassStringRecord(&self, _: Record) {} + fn PassByteStringRecord(&self, _: Record) {} + fn PassRecordOfRecords(&self, _: Record>) {} + fn PassRecordUnion(&self, _: UnionTypes::LongOrStringByteStringRecord) {} + fn PassRecordUnion2(&self, _: UnionTypes::TestBindingOrStringByteStringRecord) {} + fn PassRecordUnion3( &self, _: UnionTypes::TestBindingOrByteStringSequenceSequenceOrStringByteStringRecord, ) { } - fn ReceiveMozMap(&self) -> MozMap { - MozMap::new() + fn ReceiveRecord(&self) -> Record { + Record::new() + } + fn ReceiveRecordWithUSVStringKey(&self) -> Record { + Record::new() + } + fn ReceiveRecordWithByteStringKey(&self) -> Record { + Record::new() } - fn ReceiveNullableMozMap(&self) -> Option> { - Some(MozMap::new()) + fn ReceiveNullableRecord(&self) -> Option> { + Some(Record::new()) } - fn ReceiveMozMapOfNullableInts(&self) -> MozMap> { - MozMap::new() + fn ReceiveRecordOfNullableInts(&self) -> Record> { + Record::new() } - fn ReceiveNullableMozMapOfNullableInts(&self) -> Option>> { - Some(MozMap::new()) + fn ReceiveNullableRecordOfNullableInts(&self) -> Option>> { + Some(Record::new()) } - fn ReceiveMozMapOfMozMaps(&self) -> MozMap> { - MozMap::new() + fn ReceiveRecordOfRecords(&self) -> Record> { + Record::new() } - fn ReceiveAnyMozMap(&self) -> MozMap { - MozMap::new() + fn ReceiveAnyRecord(&self) -> Record { + Record::new() } #[allow(unrooted_must_root)] diff --git a/components/script/dom/webidls/Headers.webidl b/components/script/dom/webidls/Headers.webidl index 88e9a14c8d61..cc85136eb411 100644 --- a/components/script/dom/webidls/Headers.webidl +++ b/components/script/dom/webidls/Headers.webidl @@ -4,7 +4,7 @@ // https://fetch.spec.whatwg.org/#headers-class -typedef (Headers or sequence> or record) HeadersInit; +typedef (Headers or sequence> or record) HeadersInit; [Exposed=(Window,Worker)] interface Headers { diff --git a/components/script/dom/webidls/TestBinding.webidl b/components/script/dom/webidls/TestBinding.webidl index 0621be01858e..9c3fdc026387 100644 --- a/components/script/dom/webidls/TestBinding.webidl +++ b/components/script/dom/webidls/TestBinding.webidl @@ -461,33 +461,37 @@ interface TestBinding { sequence> returnSequenceSequence(); void passUnionSequenceSequence((long or sequence>) seq); - void passMozMap(record arg); - void passNullableMozMap(record? arg); - void passMozMapOfNullableInts(record arg); - void passOptionalMozMapOfNullableInts(optional record arg); - void passOptionalNullableMozMapOfNullableInts(optional record? arg); - void passCastableObjectMozMap(record arg); - void passNullableCastableObjectMozMap(record arg); - void passCastableObjectNullableMozMap(record? arg); - void passNullableCastableObjectNullableMozMap(record? arg); - void passOptionalMozMap(optional record arg); - void passOptionalNullableMozMap(optional record? arg); - void passOptionalNullableMozMapWithDefaultValue(optional record? arg = null); - void passOptionalObjectMozMap(optional record arg); - void passStringMozMap(record arg); - void passByteStringMozMap(record arg); - void passMozMapOfMozMaps(record> arg); - - void passMozMapUnion((long or record) init); - void passMozMapUnion2((TestBinding or record) init); - void passMozMapUnion3((TestBinding or sequence> or record) init); - - record receiveMozMap(); - record? receiveNullableMozMap(); - record receiveMozMapOfNullableInts(); - record? receiveNullableMozMapOfNullableInts(); - record> receiveMozMapOfMozMaps(); - record receiveAnyMozMap(); + void passRecord(record arg); + void passRecordWithUSVStringKey(record arg); + void passRecordWithByteStringKey(record arg); + void passNullableRecord(record? arg); + void passRecordOfNullableInts(record arg); + void passOptionalRecordOfNullableInts(optional record arg); + void passOptionalNullableRecordOfNullableInts(optional record? arg); + void passCastableObjectRecord(record arg); + void passNullableCastableObjectRecord(record arg); + void passCastableObjectNullableRecord(record? arg); + void passNullableCastableObjectNullableRecord(record? arg); + void passOptionalRecord(optional record arg); + void passOptionalNullableRecord(optional record? arg); + void passOptionalNullableRecordWithDefaultValue(optional record? arg = null); + void passOptionalObjectRecord(optional record arg); + void passStringRecord(record arg); + void passByteStringRecord(record arg); + void passRecordOfRecords(record> arg); + + void passRecordUnion((long or record) init); + void passRecordUnion2((TestBinding or record) init); + void passRecordUnion3((TestBinding or sequence> or record) init); + + record receiveRecord(); + record receiveRecordWithUSVStringKey(); + record receiveRecordWithByteStringKey(); + record? receiveNullableRecord(); + record receiveRecordOfNullableInts(); + record? receiveNullableRecordOfNullableInts(); + record> receiveRecordOfRecords(); + record receiveAnyRecord(); static attribute boolean booleanAttributeStatic; static void receiveVoidStatic(); diff --git a/tests/wpt/metadata/fetch/api/headers/headers-record.html.ini b/tests/wpt/metadata/fetch/api/headers/headers-record.html.ini deleted file mode 100644 index 999e0b2c5866..000000000000 --- a/tests/wpt/metadata/fetch/api/headers/headers-record.html.ini +++ /dev/null @@ -1,29 +0,0 @@ -[headers-record.html] - type: testharness - [Basic operation with one property] - expected: FAIL - - [Basic operation with one property and a proto] - expected: FAIL - - [Correct operation ordering with two properties] - expected: FAIL - - [Correct operation ordering with two properties one of which has an invalid name] - expected: FAIL - - [Correct operation ordering with two properties one of which has an invalid value] - expected: FAIL - - [Correct operation ordering with non-enumerable properties] - expected: FAIL - - [Correct operation ordering with undefined descriptors] - expected: FAIL - - [Basic operation with Symbol keys] - expected: FAIL - - [Operation with non-enumerable Symbol keys] - expected: FAIL - diff --git a/tests/wpt/metadata/url/urlsearchparams-constructor.any.js.ini b/tests/wpt/metadata/url/urlsearchparams-constructor.any.js.ini deleted file mode 100644 index 09df91b6479e..000000000000 --- a/tests/wpt/metadata/url/urlsearchparams-constructor.any.js.ini +++ /dev/null @@ -1,8 +0,0 @@ -[urlsearchparams-constructor.any.worker.html] - [URLSearchParams constructor, DOMException as argument] - expected: FAIL - - -[urlsearchparams-constructor.any.html] - [URLSearchParams constructor, DOMException as argument] - expected: FAIL