Index: third_party/WebKit/LayoutTests/vr/requestAnimationFrame_handoff.html |
diff --git a/third_party/WebKit/LayoutTests/vr/requestAnimationFrame_handoff.html b/third_party/WebKit/LayoutTests/vr/requestAnimationFrame_handoff.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c173930c209deb83f50e1f16bb7d4e75f9408227 |
--- /dev/null |
+++ b/third_party/WebKit/LayoutTests/vr/requestAnimationFrame_handoff.html |
@@ -0,0 +1,65 @@ |
+<!DOCTYPE html> |
+<script src="../resources/testharness.js"></script> |
+<script src="../resources/testharnessreport.js"></script> |
+<script src="../resources/mojo-helpers.js"></script> |
+<script src="resources/fake-vr-displays.js"></script> |
+<script src="resources/mock-vr-service.js"></script> |
+<canvas id="webgl-canvas"></canvas> |
+<script src="resources/presentation-setup.js"></script> |
+<script> |
+let fakeDisplays = fakeVRDisplays(); |
+ |
+// This test verifies that an application can hand off from window.rAF |
+// to vrDisplay.rAF, specifically where there is no pending vrDisplay.rAF |
+// at the time presentation starts. |
+// |
+// Caveat: This does *not* suffice to fully verify the current Android/GVR |
+// implementation. In the real implementation, the normal window VSync events |
+// (including window.rAF processing tied to them) are shut down, but in the |
+// layout test they continue running. So it's possible for this test to pass |
+// even though the scenario doesn't work in the real implementation. Keeping |
+// it as a layout test anyway as a sanity check - if this fails, we definitely |
+// have a problem. |
+ |
+vr_test( (t) => { |
+ return navigator.getVRDisplays().then( (displays) => { |
+ let display = displays[0]; |
+ |
+ let usingDisplayRAF = false; |
+ |
+ function onAnimationFrame() { |
+ if (display.isPresenting) { |
+ if (usingDisplayRAF) { |
+ t.done(); |
+ } |
+ |
+ usingDisplayRAF = true; |
+ display.requestAnimationFrame(onAnimationFrame); |
+ } else { |
+ window.requestAnimationFrame(onAnimationFrame); |
+ } |
+ } |
+ |
+ runWithUserGesture( () => { |
+ display.requestPresent([{ source : webglCanvas }]).then( () => { |
+ t.step( () => { |
+ assert_true(display.isPresenting); |
+ }, "Display should be presenting"); |
+ }, (err) => { |
+ t.step( () => { |
+ assert_unreached(err); |
+ }, "requestPresent rejected"); |
+ }); |
+ }); |
+ |
+ window.requestAnimationFrame(onAnimationFrame); |
+ }, (err) => { |
+ t.step( () => { |
+ assert_unreached("getVRDisplays rejected"); |
+ }); |
+ t.done(); |
+ }); |
+}, [fakeDisplays["Pixel"]], |
+"requestAnimationFrame properly switches from window to vrDisplay"); |
+ |
+</script> |