Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make XRSession.inputSources iterable #27227

Merged
merged 2 commits into from Jul 10, 2020
Merged
Changes from 1 commit
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

Prev

dom: Generate iterator symbol for interfaces with indexed getters.

  • Loading branch information
jdm committed Jul 10, 2020
commit 63528f6fdf192542cd811a2a3ef5f0cb2fecbc6b
@@ -1672,8 +1672,27 @@ def __init__(self, descriptor, name, static, unforgeable):
"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",
@@ -401,6 +401,9 @@ def getParentName(self):
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))
@@ -528290,6 +528290,13 @@
{}
]
],
"xrInputSourceArray_iterable.html": [
"de784d5d1a60fc15c0bea92e65a8a2a3ef0acf97",
[
null,
{}
]
],
"xrInputSource_add_remove.https.html": [
"7764017910d2e5ada78febe954e9543aca89226b",
[
@@ -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

@@ -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>
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.