blob: ae20bdfa3d088736ae7e9616df081b791828e86f [file] [log] [blame]
<!DOCTYPE html>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="../vr/resources/fake-vr-displays.js"></script>
<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
<script src="file:///gen/device/vr/vr_service.mojom.js"></script>
<script src="../vr/resources/mock-vr-service.js"></script>
<script src="../vr/resources/test-constants.js"></script>
<canvas id="webgl-canvas"></canvas>
<script src="../vr/resources/presentation-setup.js"></script>
<script>
let fakeDisplays = fakeVRDisplays();
xr_session_test( (t, session, mockService) => {
// Session must have a baseLayer or frame requests will be ignored.
let webglLayer = new XRWebGLLayer(session, gl);
session.baseLayer = webglLayer;
session.requestFrameOfReference("eyeLevel").then((frameOfRef) => {
function onFrame(time, xrFrame) {
let leftView = xrFrame.views[0];
let rightView = xrFrame.views[1];
let leftViewport = leftView.getViewport(webglLayer);
let rightViewport = rightView.getViewport(webglLayer);
// Ensure the views report the expected viewports into the WebGL layer.
t.step( () => {
assert_true(leftViewport instanceof XRViewport);
assert_true(rightViewport instanceof XRViewport);
assert_not_equals(leftViewport, null);
assert_not_equals(rightViewport, null);
}, "Viewports are of the right type and not null");
// Exact viewport values don't matter, but they must pass several tests:
t.step( () => {
assert_greater_than(leftViewport.width, 0);
assert_greater_than(leftViewport.height, 0);
assert_greater_than(rightViewport.width, 0);
assert_greater_than(rightViewport.height, 0);
}, "Viewports have non-zero widths and heights");
t.step( () => {
assert_greater_than_equal(leftViewport.x, 0);
assert_greater_than_equal(leftViewport.y, 0);
assert_greater_than_equal(leftViewport.x, 0);
assert_greater_than_equal(leftViewport.y, 0);
assert_less_than_equal(leftViewport.x + leftViewport.width, webglLayer.framebufferWidth);
assert_less_than_equal(leftViewport.y + leftViewport.height, webglLayer.framebufferHeight);
assert_less_than_equal(rightViewport.x + rightViewport.width, webglLayer.framebufferWidth);
assert_less_than_equal(rightViewport.y + rightViewport.height, webglLayer.framebufferHeight);
}, "Viewports are located within the framebuffer");
t.step( () => {
// Assumes that the left viewport will always be physically to the left
// of the right viewport.
assert_less_than_equal(leftViewport.x + leftViewport.width, rightViewport.x);
}, "XRViewports do not overlap");
t.done();
}
session.requestAnimationFrame(onFrame);
});
}, fakeDisplays["Pixel"], { exclusive: true },
"XRViewport attributes are valid");
</script>