mirror of
https://github.com/servo/servo.git
synced 2025-07-24 07:40:27 +01:00
Auto merge of #23844 - saschanaz:tojson, r=Manishearth
Support default toJSON in WebIDL <!-- Please describe your changes on the following line: --> Ported related lines from gecko. --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: --> - [x] `./mach build -d` does not report any errors - [x] `./mach test-tidy` does not report any errors - [x] These changes fix #22781 <!-- Either: --> - [x] There are tests for these changes <!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.--> <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. --> <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/23844) <!-- Reviewable:end -->
This commit is contained in:
commit
4275420a56
9 changed files with 99 additions and 158 deletions
|
@ -2881,6 +2881,42 @@ class PropertyArrays():
|
||||||
return define
|
return define
|
||||||
|
|
||||||
|
|
||||||
|
class CGCollectJSONAttributesMethod(CGAbstractMethod):
|
||||||
|
"""
|
||||||
|
Generate the CollectJSONAttributes method for an interface descriptor
|
||||||
|
"""
|
||||||
|
def __init__(self, descriptor, toJSONMethod):
|
||||||
|
args = [Argument('SafeJSContext', 'cx'),
|
||||||
|
Argument('HandleObject', 'obj'),
|
||||||
|
Argument('*const %s' % descriptor.concreteType, 'this'),
|
||||||
|
Argument('&RootedGuard<*mut JSObject>', 'result')]
|
||||||
|
CGAbstractMethod.__init__(self, descriptor, 'CollectJSONAttributes',
|
||||||
|
'bool', args, pub=True, unsafe=True)
|
||||||
|
self.toJSONMethod = toJSONMethod
|
||||||
|
|
||||||
|
def definition_body(self):
|
||||||
|
ret = ''
|
||||||
|
interface = self.descriptor.interface
|
||||||
|
for m in interface.members:
|
||||||
|
if m.isAttr() and not m.isStatic() and m.type.isJSONType():
|
||||||
|
name = m.identifier.name
|
||||||
|
ret += fill(
|
||||||
|
"""
|
||||||
|
rooted!(in(*cx) let mut temp = UndefinedValue());
|
||||||
|
if !get_${name}(cx, obj, this, JSJitGetterCallArgs { _base: temp.handle_mut().into() }) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if !JS_DefineProperty(*cx, result.handle().into(),
|
||||||
|
${nameAsArray} as *const u8 as *const libc::c_char,
|
||||||
|
temp.handle(), JSPROP_ENUMERATE as u32) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
""",
|
||||||
|
name=name, nameAsArray=str_to_const_array(name))
|
||||||
|
ret += 'return true;\n'
|
||||||
|
return CGGeneric(ret)
|
||||||
|
|
||||||
|
|
||||||
class CGCreateInterfaceObjectsMethod(CGAbstractMethod):
|
class CGCreateInterfaceObjectsMethod(CGAbstractMethod):
|
||||||
"""
|
"""
|
||||||
Generate the CreateInterfaceObjects method for an interface descriptor.
|
Generate the CreateInterfaceObjects method for an interface descriptor.
|
||||||
|
@ -3619,6 +3655,42 @@ class CGSpecializedMethod(CGAbstractExternMethod):
|
||||||
return MakeNativeName(nativeName)
|
return MakeNativeName(nativeName)
|
||||||
|
|
||||||
|
|
||||||
|
class CGDefaultToJSONMethod(CGSpecializedMethod):
|
||||||
|
def __init__(self, descriptor, method):
|
||||||
|
assert method.isDefaultToJSON()
|
||||||
|
CGSpecializedMethod.__init__(self, descriptor, method)
|
||||||
|
|
||||||
|
def definition_body(self):
|
||||||
|
ret = dedent("""
|
||||||
|
rooted!(in(*cx) let result = JS_NewPlainObject(*cx));
|
||||||
|
if result.is_null() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
""")
|
||||||
|
|
||||||
|
jsonDescriptors = [self.descriptor]
|
||||||
|
interface = self.descriptor.interface.parent
|
||||||
|
while interface:
|
||||||
|
descriptor = self.descriptor.getDescriptor(interface.identifier.name)
|
||||||
|
if descriptor.hasDefaultToJSON:
|
||||||
|
jsonDescriptors.append(descriptor)
|
||||||
|
interface = interface.parent
|
||||||
|
|
||||||
|
form = """
|
||||||
|
if !${parentclass}CollectJSONAttributes(cx, _obj, this, &result) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Iterate the array in reverse: oldest ancestor first
|
||||||
|
for descriptor in jsonDescriptors[:0:-1]:
|
||||||
|
ret += fill(form, parentclass=toBindingNamespace(descriptor.name) + "::")
|
||||||
|
ret += fill(form, parentclass="")
|
||||||
|
ret += ('(*args).rval().set(ObjectValue(*result));\n'
|
||||||
|
'return true;\n')
|
||||||
|
return CGGeneric(ret)
|
||||||
|
|
||||||
|
|
||||||
class CGStaticMethod(CGAbstractStaticBindingMethod):
|
class CGStaticMethod(CGAbstractStaticBindingMethod):
|
||||||
"""
|
"""
|
||||||
A class for generating the Rust code for an IDL static method.
|
A class for generating the Rust code for an IDL static method.
|
||||||
|
@ -5665,7 +5737,8 @@ class CGInterfaceTrait(CGThing):
|
||||||
for m in descriptor.interface.members:
|
for m in descriptor.interface.members:
|
||||||
if (m.isMethod() and not m.isStatic() and
|
if (m.isMethod() and not m.isStatic() and
|
||||||
not m.isMaplikeOrSetlikeOrIterableMethod() and
|
not m.isMaplikeOrSetlikeOrIterableMethod() and
|
||||||
(not m.isIdentifierLess() or m.isStringifier())):
|
(not m.isIdentifierLess() or m.isStringifier()) and
|
||||||
|
not m.isDefaultToJSON()):
|
||||||
name = CGSpecializedMethod.makeNativeName(descriptor, m)
|
name = CGSpecializedMethod.makeNativeName(descriptor, m)
|
||||||
infallible = 'infallible' in descriptor.getExtendedAttributes(m)
|
infallible = 'infallible' in descriptor.getExtendedAttributes(m)
|
||||||
for idx, (rettype, arguments) in enumerate(m.signatures()):
|
for idx, (rettype, arguments) in enumerate(m.signatures()):
|
||||||
|
@ -5856,7 +5929,9 @@ def generate_imports(config, cgthings, descriptors, callbacks=None, dictionaries
|
||||||
'js::jsapi::JS_HasProperty',
|
'js::jsapi::JS_HasProperty',
|
||||||
'js::jsapi::JS_HasPropertyById',
|
'js::jsapi::JS_HasPropertyById',
|
||||||
'js::rust::wrappers::JS_InitializePropertiesFromCompatibleNativeObject',
|
'js::rust::wrappers::JS_InitializePropertiesFromCompatibleNativeObject',
|
||||||
|
'js::jsapi::JS_NewPlainObject',
|
||||||
'js::jsapi::JS_NewObject',
|
'js::jsapi::JS_NewObject',
|
||||||
|
'js::rust::RootedGuard',
|
||||||
'js::rust::wrappers::JS_NewObjectWithGivenProto',
|
'js::rust::wrappers::JS_NewObjectWithGivenProto',
|
||||||
'js::rust::wrappers::JS_NewObjectWithoutMetadata',
|
'js::rust::wrappers::JS_NewObjectWithoutMetadata',
|
||||||
'js::rust::wrappers::ObjectIsDate',
|
'js::rust::wrappers::ObjectIsDate',
|
||||||
|
@ -6055,6 +6130,7 @@ class CGDescriptor(CGThing):
|
||||||
|
|
||||||
cgThings = []
|
cgThings = []
|
||||||
|
|
||||||
|
defaultToJSONMethod = None
|
||||||
unscopableNames = []
|
unscopableNames = []
|
||||||
for m in descriptor.interface.members:
|
for m in descriptor.interface.members:
|
||||||
if (m.isMethod() and
|
if (m.isMethod() and
|
||||||
|
@ -6062,7 +6138,9 @@ class CGDescriptor(CGThing):
|
||||||
if m.getExtendedAttribute("Unscopable"):
|
if m.getExtendedAttribute("Unscopable"):
|
||||||
assert not m.isStatic()
|
assert not m.isStatic()
|
||||||
unscopableNames.append(m.identifier.name)
|
unscopableNames.append(m.identifier.name)
|
||||||
if m.isStatic():
|
if m.isDefaultToJSON():
|
||||||
|
defaultToJSONMethod = m
|
||||||
|
elif m.isStatic():
|
||||||
assert descriptor.interface.hasInterfaceObject()
|
assert descriptor.interface.hasInterfaceObject()
|
||||||
cgThings.append(CGStaticMethod(descriptor, m))
|
cgThings.append(CGStaticMethod(descriptor, m))
|
||||||
elif not descriptor.interface.isCallback():
|
elif not descriptor.interface.isCallback():
|
||||||
|
@ -6096,6 +6174,10 @@ class CGDescriptor(CGThing):
|
||||||
if (not m.isStatic() and not descriptor.interface.isCallback()):
|
if (not m.isStatic() and not descriptor.interface.isCallback()):
|
||||||
cgThings.append(CGMemberJITInfo(descriptor, m))
|
cgThings.append(CGMemberJITInfo(descriptor, m))
|
||||||
|
|
||||||
|
if defaultToJSONMethod:
|
||||||
|
cgThings.append(CGDefaultToJSONMethod(descriptor, defaultToJSONMethod))
|
||||||
|
cgThings.append(CGMemberJITInfo(descriptor, defaultToJSONMethod))
|
||||||
|
|
||||||
if descriptor.concrete:
|
if descriptor.concrete:
|
||||||
cgThings.append(CGClassFinalizeHook(descriptor))
|
cgThings.append(CGClassFinalizeHook(descriptor))
|
||||||
cgThings.append(CGClassTraceHook(descriptor))
|
cgThings.append(CGClassTraceHook(descriptor))
|
||||||
|
@ -6113,6 +6195,9 @@ class CGDescriptor(CGThing):
|
||||||
|
|
||||||
properties = PropertyArrays(descriptor)
|
properties = PropertyArrays(descriptor)
|
||||||
|
|
||||||
|
if defaultToJSONMethod:
|
||||||
|
cgThings.append(CGCollectJSONAttributesMethod(descriptor, defaultToJSONMethod))
|
||||||
|
|
||||||
if descriptor.concrete:
|
if descriptor.concrete:
|
||||||
if descriptor.proxy:
|
if descriptor.proxy:
|
||||||
# cgThings.append(CGProxyIsProxy(descriptor))
|
# cgThings.append(CGProxyIsProxy(descriptor))
|
||||||
|
|
|
@ -250,6 +250,8 @@ class Descriptor(DescriptorProvider):
|
||||||
'Stringifier': None,
|
'Stringifier': None,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.hasDefaultToJSON = False
|
||||||
|
|
||||||
def addOperation(operation, m):
|
def addOperation(operation, m):
|
||||||
if not self.operations[operation]:
|
if not self.operations[operation]:
|
||||||
self.operations[operation] = m
|
self.operations[operation] = m
|
||||||
|
@ -259,6 +261,8 @@ class Descriptor(DescriptorProvider):
|
||||||
for m in self.interface.members:
|
for m in self.interface.members:
|
||||||
if m.isMethod() and m.isStringifier():
|
if m.isMethod() and m.isStringifier():
|
||||||
addOperation('Stringifier', m)
|
addOperation('Stringifier', m)
|
||||||
|
if m.isMethod() and m.isDefaultToJSON():
|
||||||
|
self.hasDefaultToJSON = True
|
||||||
|
|
||||||
if self.concrete:
|
if self.concrete:
|
||||||
iface = self.interface
|
iface = self.interface
|
||||||
|
|
|
@ -14,12 +14,7 @@ use crate::dom::bindings::root::DomRoot;
|
||||||
use crate::dom::bindings::str::DOMString;
|
use crate::dom::bindings::str::DOMString;
|
||||||
use crate::dom::globalscope::GlobalScope;
|
use crate::dom::globalscope::GlobalScope;
|
||||||
use crate::dom::window::Window;
|
use crate::dom::window::Window;
|
||||||
use crate::script_runtime::JSContext;
|
|
||||||
use dom_struct::dom_struct;
|
use dom_struct::dom_struct;
|
||||||
use js::conversions::ToJSValConvertible;
|
|
||||||
use js::jsapi::JSObject;
|
|
||||||
use js::jsval::UndefinedValue;
|
|
||||||
use std::ptr::NonNull;
|
|
||||||
|
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
pub struct RTCSessionDescription {
|
pub struct RTCSessionDescription {
|
||||||
|
@ -71,18 +66,4 @@ impl RTCSessionDescriptionMethods for RTCSessionDescription {
|
||||||
fn Sdp(&self) -> DOMString {
|
fn Sdp(&self) -> DOMString {
|
||||||
self.sdp.clone()
|
self.sdp.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unsafe_code)]
|
|
||||||
/// https://w3c.github.io/webrtc-pc/#dom-rtcsessiondescription-tojson
|
|
||||||
fn ToJSON(&self, cx: JSContext) -> NonNull<JSObject> {
|
|
||||||
let init = RTCSessionDescriptionInit {
|
|
||||||
type_: self.ty,
|
|
||||||
sdp: self.sdp.clone(),
|
|
||||||
};
|
|
||||||
unsafe {
|
|
||||||
rooted!(in(*cx) let mut jsval = UndefinedValue());
|
|
||||||
init.to_jsval(*cx, jsval.handle_mut());
|
|
||||||
NonNull::new(jsval.to_object()).unwrap()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -81,7 +81,6 @@ interface DOMMatrixReadOnly {
|
||||||
DOMPoint transformPoint(optional DOMPointInit point = {});
|
DOMPoint transformPoint(optional DOMPointInit point = {});
|
||||||
Float32Array toFloat32Array();
|
Float32Array toFloat32Array();
|
||||||
Float64Array toFloat64Array();
|
Float64Array toFloat64Array();
|
||||||
// stringifier;
|
// [Exposed=Window] stringifier;
|
||||||
// serializer = { attribute };
|
[Default] object toJSON();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -20,4 +20,6 @@ interface DOMPointReadOnly {
|
||||||
readonly attribute unrestricted double y;
|
readonly attribute unrestricted double y;
|
||||||
readonly attribute unrestricted double z;
|
readonly attribute unrestricted double z;
|
||||||
readonly attribute unrestricted double w;
|
readonly attribute unrestricted double w;
|
||||||
|
|
||||||
|
[Default] object toJSON();
|
||||||
};
|
};
|
||||||
|
|
|
@ -22,6 +22,8 @@ interface DOMQuad {
|
||||||
[SameObject] readonly attribute DOMPoint p3;
|
[SameObject] readonly attribute DOMPoint p3;
|
||||||
[SameObject] readonly attribute DOMPoint p4;
|
[SameObject] readonly attribute DOMPoint p4;
|
||||||
[NewObject] DOMRect getBounds();
|
[NewObject] DOMRect getBounds();
|
||||||
|
|
||||||
|
[Default] object toJSON();
|
||||||
};
|
};
|
||||||
|
|
||||||
dictionary DOMQuadInit {
|
dictionary DOMQuadInit {
|
||||||
|
|
|
@ -17,6 +17,8 @@ interface DOMRectReadOnly {
|
||||||
readonly attribute unrestricted double right;
|
readonly attribute unrestricted double right;
|
||||||
readonly attribute unrestricted double bottom;
|
readonly attribute unrestricted double bottom;
|
||||||
readonly attribute unrestricted double left;
|
readonly attribute unrestricted double left;
|
||||||
|
|
||||||
|
[Default] object toJSON();
|
||||||
};
|
};
|
||||||
|
|
||||||
// https://drafts.fxtf.org/geometry/#dictdef-domrectinit
|
// https://drafts.fxtf.org/geometry/#dictdef-domrectinit
|
||||||
|
|
|
@ -282,36 +282,6 @@
|
||||||
[DOMMatrix interface: calling setMatrixValue(DOMString) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError]
|
[DOMMatrix interface: calling setMatrixValue(DOMString) on DOMMatrix.fromMatrix({is2D: false}) with too few arguments must throw TypeError]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[DOMPointReadOnly interface: operation toJSON()]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "toJSON()" with the proper type]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Test default toJSON operation of DOMPointReadOnly]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[DOMPointReadOnly interface: new DOMPoint() must inherit property "toJSON()" with the proper type]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Test default toJSON operation of DOMPoint]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[DOMRectReadOnly interface: operation toJSON()]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "toJSON()" with the proper type]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Test default toJSON operation of DOMRectReadOnly]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[DOMRectReadOnly interface: new DOMRect() must inherit property "toJSON()" with the proper type]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Test default toJSON operation of DOMRect]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[DOMRectList interface: existence and properties of interface object]
|
[DOMRectList interface: existence and properties of interface object]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
@ -339,42 +309,5 @@
|
||||||
[DOMRectList must be primary interface of [object DOMRect\]]
|
[DOMRectList must be primary interface of [object DOMRect\]]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[DOMQuad interface: operation toJSON()]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[DOMQuad interface: new DOMQuad() must inherit property "toJSON()" with the proper type]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Test default toJSON operation of DOMQuad]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[DOMMatrixReadOnly interface: operation toJSON()]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "toJSON()" with the proper type]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Test default toJSON operation of DOMMatrixReadOnly]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Geometry APIs interface IDL tests]
|
[Geometry APIs interface IDL tests]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[DOMPointReadOnly interface: default toJSON operation on new DOMPoint()]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[DOMPointReadOnly interface: default toJSON operation on new DOMPointReadOnly()]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[DOMRectReadOnly interface: default toJSON operation on new DOMRect()]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[DOMRectReadOnly interface: default toJSON operation on new DOMRectReadOnly()]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[DOMQuad interface: default toJSON operation on new DOMQuad()]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[DOMMatrixReadOnly interface: default toJSON operation on new DOMMatrixReadOnly()]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
|
|
|
@ -29,75 +29,8 @@
|
||||||
[DOMRectReadOnly interface: calling fromRect(DOMRectInit) on new DOMRect() with too few arguments must throw TypeError]
|
[DOMRectReadOnly interface: calling fromRect(DOMRectInit) on new DOMRect() with too few arguments must throw TypeError]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[DOMPointReadOnly interface: operation toJSON()]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[DOMPointReadOnly interface: new DOMPointReadOnly() must inherit property "toJSON()" with the proper type]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Test default toJSON operation of DOMPointReadOnly]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[DOMPointReadOnly interface: new DOMPoint() must inherit property "toJSON()" with the proper type]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Test default toJSON operation of DOMPoint]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[DOMRectReadOnly interface: operation toJSON()]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[DOMRectReadOnly interface: new DOMRectReadOnly() must inherit property "toJSON()" with the proper type]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Test default toJSON operation of DOMRectReadOnly]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[DOMRectReadOnly interface: new DOMRect() must inherit property "toJSON()" with the proper type]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Test default toJSON operation of DOMRect]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[DOMQuad interface: operation toJSON()]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[DOMQuad interface: new DOMQuad() must inherit property "toJSON()" with the proper type]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Test default toJSON operation of DOMQuad]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[DOMMatrixReadOnly interface: operation toJSON()]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[DOMMatrixReadOnly interface: new DOMMatrixReadOnly() must inherit property "toJSON()" with the proper type]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Test default toJSON operation of DOMMatrixReadOnly]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Untitled]
|
[Untitled]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[interfaces]
|
[interfaces]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[DOMPointReadOnly interface: default toJSON operation on new DOMPoint()]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[DOMPointReadOnly interface: default toJSON operation on new DOMPointReadOnly()]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[DOMRectReadOnly interface: default toJSON operation on new DOMRect()]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[DOMRectReadOnly interface: default toJSON operation on new DOMRectReadOnly()]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[DOMQuad interface: default toJSON operation on new DOMQuad()]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[DOMMatrixReadOnly interface: default toJSON operation on new DOMMatrixReadOnly()]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue