| <!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_single_view.js"></script> |
| |
| <script> |
| let testName = "XRViewport attributes are valid even when there is only one view"; |
| |
| let fakeDeviceInitParams = TRACKED_IMMERSIVE_SINGLE_VIEWDEVICE; |
| |
| let testFunction = function(session, fakeDeviceController, t, sessionObjects) { |
| return session.requestReferenceSpace('local') |
| .then((referenceSpace) => new Promise((resolve) =>{ |
| let webglLayer = sessionObjects.glLayer; |
| function onFrame(time, xrFrame) { |
| let pose = xrFrame.getViewerPose(referenceSpace); |
| assert_not_equals(pose, null); |
| assert_not_equals(pose.views, null); |
| assert_equals(pose.views.length, 1); |
| |
| let leftView = pose.views[0]; |
| |
| let leftViewport = webglLayer.getViewport(leftView); |
| |
| t.step(() => { |
| // Ensure the views report the expected viewports into the WebGL layer. |
| assert_true(leftViewport instanceof XRViewport); |
| |
| assert_not_equals(leftViewport, null); |
| |
| // Exact viewport values don't matter, but they must pass several tests: |
| |
| // Viewports have non-zero widths and heights. |
| assert_greater_than(leftViewport.width, 0); |
| assert_greater_than(leftViewport.height, 0); |
| |
| // Viewports are located within the framebuffer. |
| 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); |
| }); |
| |
| resolve(); |
| } |
| session.requestAnimationFrame(onFrame); |
| })); |
| }; |
| |
| xr_session_promise_test( |
| testName, testFunction, fakeDeviceInitParams, 'immersive-vr'); |
| |
| </script> |