| function getWakeLockObject(iframe, url) { |
| return new Promise(resolve => { |
| iframe.addEventListener( |
| "load", |
| () => { |
| const { wakeLock } = iframe.contentWindow.navigator; |
| resolve(wakeLock); |
| }, |
| { once: true } |
| ); |
| iframe.src = url; |
| }); |
| } |
| |
| promise_test(async t => { |
| const iframe = document.createElement("iframe"); |
| document.body.appendChild(iframe); |
| // We first got to page1.html, grab a WakeLock object. |
| const wakeLock1 = await getWakeLockObject( |
| iframe, |
| "/screen-wake-lock/resources/page1.html" |
| ); |
| // Save the DOMException of page1.html before navigating away. |
| const frameDOMException1 = iframe.contentWindow.DOMException; |
| // We navigate the iframe again, putting wakeLock1's document into an inactive state. |
| const wakeLock2 = await getWakeLockObject( |
| iframe, |
| "/screen-wake-lock/resources/page2.html" |
| ); |
| // Now, wakeLock1's relevant global object's document is no longer active. |
| // So, call .request(), and make sure it rejects appropriately. |
| await promise_rejects_dom( |
| t, |
| "NotAllowedError", |
| frameDOMException1, |
| wakeLock1.request('screen'), |
| "Inactive document, so must throw NotAllowedError" |
| ); |
| // We are done, so clean up. |
| iframe.remove(); |
| }, "navigator.wakeLock.request() aborts if the document is not active."); |
| |
| promise_test(async t => { |
| // We nest two iframes and wait for them to load. |
| const outerIframe = document.createElement("iframe"); |
| document.body.appendChild(outerIframe); |
| // Load the outer iframe (we don't care about the awaited request) |
| await getWakeLockObject( |
| outerIframe, |
| "/screen-wake-lock/resources/page1.html" |
| ); |
| |
| // Now we create the inner iframe |
| const innerIframe = outerIframe.contentDocument.createElement("iframe"); |
| |
| // nest them |
| outerIframe.contentDocument.body.appendChild(innerIframe); |
| |
| // load innerIframe, and get the WakeLock instance |
| const wakeLock = await getWakeLockObject( |
| innerIframe, |
| "/screen-wake-lock/resources/page2.html" |
| ); |
| // Save DOMException from innerIframe before navigating away. |
| const innerIframeDOMException = innerIframe.contentWindow.DOMException; |
| |
| // Navigate the outer iframe to a new location. |
| // Wait for the load event to fire. |
| await new Promise(resolve => { |
| outerIframe.addEventListener("load", resolve); |
| outerIframe.src = "/screen-wake-lock/resources/page2.html"; |
| }); |
| |
| // Now, request's relevant global object's document is still active |
| // (it is the active document of the inner iframe), but is not fully active |
| // (since the parent of the inner iframe is itself no longer active). |
| // So, call request.show() and make sure it rejects appropriately. |
| await promise_rejects_dom( |
| t, |
| "NotAllowedError", |
| innerIframeDOMException, |
| wakeLock.request('screen'), |
| "Active, but not fully active, so must throw NotAllowedError" |
| ); |
| // We are done, so clean up. |
| outerIframe.remove(); |
| }, "navigator.wakeLock.request() aborts if the document is active, but not fully active."); |