dom: Generate iterator symbol for interfaces with indexed getters.

This commit is contained in:
Josh Matthews 2020-07-09 20:03:03 -04:00
parent aa80f91399
commit 63528f6fdf
5 changed files with 65 additions and 5 deletions

View file

@ -1672,8 +1672,27 @@ class MethodDefiner(PropertyDefiner):
"condition": PropertyDefiner.getControllingCondition(m, descriptor)}
for m in methods]
# FIXME Check for an existing iterator on the interface first.
if any(m.isGetter() and m.isIndexed() for m in methods):
# TODO: Once iterable is implemented, use tiebreak rules instead of
# failing. Also, may be more tiebreak rules to implement once spec bug
# is resolved.
# https://www.w3.org/Bugs/Public/show_bug.cgi?id=28592
def hasIterator(methods, regular):
return (any("@@iterator" in m.aliases for m in methods)
or any("@@iterator" == r["name"] for r in regular))
# Check whether we need to output an @@iterator due to having an indexed
# getter. We only do this while outputting non-static and
# non-unforgeable methods, since the @@iterator function will be
# neither.
if (not static
and not unforgeable
and descriptor.supportsIndexedProperties()): # noqa
if hasIterator(methods, self.regular): # noqa
raise TypeError("Cannot have indexed getter/attr on "
"interface %s with other members "
"that generate @@iterator, such as "
"maplike/setlike or aliased functions." %
self.descriptor.interface.identifier.name)
self.regular.append({"name": '@@iterator',
"methodInfo": False,
"selfHostedName": "$ArrayValues",

View file

@ -401,6 +401,9 @@ class Descriptor(DescriptorProvider):
parent = parent.parent
return None
def supportsIndexedProperties(self):
return self.operations['IndexedGetter'] is not None
def hasDescendants(self):
return (self.interface.getUserData("hasConcreteDescendant", False)
or self.interface.getUserData("hasProxyDescendant", False))

View file

@ -528290,6 +528290,13 @@
{}
]
],
"xrInputSourceArray_iterable.html": [
"de784d5d1a60fc15c0bea92e65a8a2a3ef0acf97",
[
null,
{}
]
],
"xrInputSource_add_remove.https.html": [
"7764017910d2e5ada78febe954e9543aca89226b",
[

View file

@ -2,9 +2,6 @@
[XR interface: attribute ondevicechange]
expected: FAIL
[XRInputSourceArray interface: iterable<XRInputSource>]
expected: FAIL
[XR interface: calling supportsSession(XRSessionMode) on navigator.xr with too few arguments must throw TypeError]
expected: FAIL

View file

@ -0,0 +1,34 @@
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/webxr_util.js"></script>
<script src="resources/webxr_test_constants.js"></script>
<canvas id="webgl-canvas"></canvas>
<script>
let testName = "XRInputSourceArray is iterable";
let testFunction = function(session, fakeDeviceController, t) {
return new Promise((resolve) => {
let input_source = fakeDeviceController.simulateInputSourceConnection({
handedness: "right",
targetRayMode: "tracked-pointer",
pointerOrigin: VALID_POINTER_TRANSFORM,
gripOrigin: VALID_GRIP_TRANSFORM,
profiles: ["foo", "bar"]
});
requestSkipAnimationFrame(session, (time, xrFrame) => {
let sources = [];
t.step(() => {
for (const source of session.inputSources) {
sources.push(source);
}
assert_equals(sources.length, 1);
});
resolve();
});
});
};
xr_session_promise_test(
testName, testFunction, TRACKED_IMMERSIVE_DEVICE, 'immersive-vr');
</script>