test_vrDisplay_requestPresent.html (6183B)
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>VRDisplay RequestPresent</title> 5 <meta name="timeout" content="long"/> 6 <script src="/resources/testharness.js"></script> 7 <script src="/resources/testharnessreport.js"></script> 8 <script src="VRSimulationDriver.js"></script> 9 <script src="WebVRHelpers.js"></script> 10 <script src="requestPresent.js"></script> 11 <script src="runVRTest.js"></script> 12 </head> 13 <body id="body"> 14 <canvas id="webglCanvas"></canvas> 15 <div id="testDiv"></div> 16 <script> 17 "use strict"; 18 var vrDisplay; 19 var canvas = document.getElementById('webglCanvas'); 20 var div = document.getElementById('testDiv'); 21 function startTest() { 22 promise_test((test) => { 23 return setupVRDisplay(test).then(() => { 24 return promise_rejects(test, null, WebVRHelpers.RequestPresentOnVRDisplay(vrDisplay, [{}])); 25 }).then(() => { 26 return validateDisplayNotPresenting(test, vrDisplay); 27 }); 28 }, "WebVR requestPresent rejected with empty frames"); 29 30 promise_test((test) => { 31 return setupVRDisplay(test).then(() => { 32 return promise_rejects(test, null, WebVRHelpers.RequestPresentOnVRDisplay(vrDisplay, [{ source: canvas, leftBounds: [0.0, 0.0] }])); 33 }).then(() => { 34 return validateDisplayNotPresenting(test, vrDisplay); 35 }); 36 }, "WebVR requestPresent rejected with incorrect bounds (bounds arrays must be 0 or 4 long)"); 37 38 promise_test((test) => { 39 return setupVRDisplay(test).then(() => { 40 return promise_rejects(test, null, WebVRHelpers.RequestPresentOnVRDisplay(vrDisplay, [{ source: div }])); 41 }).then(() => { 42 return validateDisplayNotPresenting(test, vrDisplay); 43 }); 44 }, "WebVR requestPresent rejected with invalid source (must be canvas element)"); 45 46 promise_test((test) => { 47 return setupVRDisplay(test).then(() => { 48 return promise_rejects(test, null, WebVRHelpers.RequestPresentOnVRDisplay(vrDisplay, [{ source: canvas, leftBounds: [div] }])); 49 }).then(() => { 50 return validateDisplayNotPresenting(test, vrDisplay); 51 }); 52 }, "WebVR requestPresent rejected with invalid bounds data type (must be able to convert to float)"); 53 54 const invalidBounds = [ 55 [2.0, 0.0, 0.0, 0.0], 56 [0.0, 2.0, 0.0, 0.0], 57 [0.0, 0.0, 2.0, 0.0], 58 [0.0, 0.0, 0.0, 2.0], 59 [-1.0, 0.0, 0.0, 0.0], 60 [0.0, -1.0, 0.0, 0.0], 61 [0.0, 0.0, -1.0, 0.0], 62 [0.0, 0.0, 0.0, -1.0]]; 63 64 invalidBounds.forEach((bound) => { 65 promise_test((test) => { 66 return setupVRDisplay(test).then(() => { 67 return promise_rejects(test, null, WebVRHelpers.RequestPresentOnVRDisplay(vrDisplay, [{ source: canvas, leftBounds: bound }])); 68 }).then(() => { 69 return validateDisplayNotPresenting(test, vrDisplay); 70 }); 71 }, "WebVR requestPresent rejected with bounds in invalid range: [" + bound + "]"); 72 }); 73 74 promise_test((test) => { 75 return setupVRDisplay(test).then(() => { 76 var promise = vrDisplay.requestPresent({ source: canvas }); 77 return promise_rejects(test, null, promise); 78 }).then(() => { 79 return validateDisplayNotPresenting(test, vrDisplay); 80 }); 81 }, "WebVR requestPresent rejected without user initiated action"); 82 83 promise_test((test) => { 84 return setupVRDisplay(test).then(() => { 85 return promise_rejects(test, null, WebVRHelpers.RequestPresentOnVRDisplay(vrDisplay, [{ source: canvas }, { source: canvas }])); 86 }).then(() => { 87 return validateDisplayNotPresenting(test, vrDisplay); 88 }); 89 }, "WebVR requestPresent rejected with more frames than max layers"); 90 91 promise_test((test) => { 92 return setupVRDisplay(test).then(() => { 93 function requestAgain() { 94 // Callback for immediate requestPresent call for further testing. 95 // Cache this promise on global object since it seems to be the only object 96 // in scope across calls. 97 window.promiseSecond = vrDisplay.requestPresent([{ source: canvas }]); 98 } 99 return WebVRHelpers.RequestPresentOnVRDisplay(vrDisplay, [{ source: canvas }], requestAgain); 100 }).then(() => { 101 // First promise succeeded 102 assert_true(vrDisplay.isPresenting, "First promise should successfully fulfill"); 103 // Now, validate that the subsequent requestPresent was rejected 104 return promise_rejects(test, null, window.promiseSecond); 105 }).then(() => { 106 delete window.promiseSecond; 107 assert_true(vrDisplay.isPresenting, "Should still be presenting after rejected second promise"); 108 return vrDisplay.exitPresent(); 109 }); 110 }, "WebVR requestPresent fails while another one is in progress"); 111 112 promise_test((test) => { 113 return setupVRDisplay(test).then(() => { 114 return WebVRHelpers.RequestPresentOnVRDisplay(vrDisplay, [{ source: canvas }]); 115 }).then(() => { 116 assert_true(vrDisplay.isPresenting, "vrDisplay.isPresenting must be true if requestPresent is fulfilled."); 117 assert_equals(vrDisplay.getLayers().length, 1, "vrDisplay.getLayers() should return one layer."); 118 return vrDisplay.exitPresent(); 119 }).then(() => { 120 assert_false(vrDisplay.isPresenting, "vrDisplay.isPresenting must be false if exitPresent is fulfilled."); 121 // exitPresent() should reject since we are no longer presenting. 122 return promise_rejects(test, null, vrDisplay.exitPresent()); 123 }); 124 }, "WebVR requestPresent fulfilled"); 125 } 126 127 runVRTest(startTest); 128 </script> 129 </body> 130 </html>