| <!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> |
| |
| <script> |
| let testName = "Ensures that the XRSession's visibilityState is correctly " |
| + "reported and that the associated visibilitychange event fires."; |
| |
| let watcherDone = new Event("watcherdone"); |
| let frameFired = new Event("framefired"); |
| |
| let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE; |
| |
| let testFunction = function(session, fakeDeviceController, t) { |
| let eventWatcher = new EventWatcher( |
| t, session, ["visibilitychange", "framefired", "watcherdone"]); |
| let eventPromise = eventWatcher.wait_for( |
| ["visibilitychange", "visibilitychange", "framefired", "watcherdone"]); |
| |
| function onFrame(timestamp, frame) { |
| t.step( () => { |
| // The session should not fire any animation frames while the visibility |
| // state is hidden. |
| assert_not_equals(session.visibilityState, "hidden"); |
| }); |
| |
| // Make sure the frame does fire when the visibility is changed back to "visible" |
| session.dispatchEvent(frameFired); |
| } |
| |
| function onSessionVisibilityChangeHidden(event) { |
| t.step( () => { |
| assert_equals(session.visibilityState, "hidden"); |
| }); |
| |
| session.removeEventListener("visibilitychange", onSessionVisibilityChangeHidden, false); |
| session.addEventListener("visibilitychange", onSessionVisibilityChangeVisible, false); |
| |
| session.requestAnimationFrame(onFrame) |
| |
| t.step_timeout(() => { |
| fakeDeviceController.simulateVisibilityChange("visible"); |
| }, 300); |
| } |
| |
| function onSessionVisibilityChangeVisible(event) { |
| t.step( () => { |
| assert_equals(session.visibilityState, "visible"); |
| }); |
| |
| session.removeEventListener("visibilitychange", onSessionVisibilityChangeVisible, false); |
| session.addEventListener("visibilitychange", onSessionVisibilityChangeInvalid, false); |
| fakeDeviceController.simulateVisibilityChange("visible"); |
| |
| t.step_timeout(() => { |
| session.dispatchEvent(watcherDone); |
| }, 300); |
| } |
| |
| function onSessionVisibilityChangeInvalid(event) { |
| t.step( () => { |
| assert_not_reached("Should not fire visibilitychange events for the same state"); |
| }); |
| } |
| |
| t.step( () => { |
| // Session visibility should start out as "visible" |
| assert_equals(session.visibilityState, "visible"); |
| }); |
| |
| session.addEventListener("visibilitychange", onSessionVisibilityChangeHidden, false); |
| fakeDeviceController.simulateVisibilityChange("hidden"); |
| |
| return eventPromise; |
| }; |
| |
| xr_session_promise_test( |
| testName, testFunction, fakeDeviceInitParams, 'immersive-vr'); |
| |
| </script> |