| <!DOCTYPE html> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="/html/interaction/focus/the-autofocus-attribute/resources/utils.js"></script> |
| <script src="/resources/user-gesture-utils.js"></script> |
| <body> |
| <script> |
| |
| // Returns a promise that will perform `w.focus()` but via a user action in |
| // order to allow moving the system focus to the window. It then waits for the |
| // system focus to be applied which requires a round trip through the browser |
| // process. |
| function focusWithUserGestureAndAwaitSystemFocus(w) { |
| var focus_w = document.createElement('a'); |
| focus_w.onclick = () => { w.focus(); }; |
| focus_w.innerText = 'focus_w'; |
| document.body.appendChild(focus_w); |
| if (eventSender) { |
| eventSender.mouseMoveTo(focus_w.getBoundingClientRect().x, |
| focus_w.getBoundingClientRect().y); |
| eventSender.mouseDown(); |
| eventSender.mouseUp(); |
| } |
| document.body.removeChild(focus_w); |
| return new Promise((resolve, reject) => { |
| // Ensures any events that involve the browser have a chance to be processed |
| // and replied to, then calls the given function. |
| var frame = document.createElement('iframe'); |
| // An OOPIF navigation requires the browser to participate. |
| frame.src = "http://localhost:8080/resources/blank.html"; |
| frame.addEventListener('load', () => { |
| document.body.removeChild(frame); |
| resolve(); |
| }); |
| document.body.appendChild(frame); |
| }); |
| } |
| |
| async function setupBlankWindow(t) { |
| let w = window.open('/common/blank.html'); |
| await waitForLoad(w); |
| t.add_cleanup(() => { w.close(); }); |
| await focusWithUserGestureAndAwaitSystemFocus(w); |
| return w; |
| } |
| |
| promise_test(async t => { |
| let w = await setupBlankWindow(t); |
| w.document.body.innerHTML = '<object data="/common/blank.html"><input autofocus></object>'; |
| await waitUntilStableAutofocusState(w); |
| assert_equals(w.document.activeElement.tagName, 'BODY'); |
| }, 'An autofocus element in an OBJECT with a loaded frame should not be processed'); |
| |
| promise_test(async t => { |
| let w = await setupBlankWindow(t); |
| w.document.body.innerHTML = '<object data="/common/non-existent.html"><input autofocus></object>'; |
| await waitForEvent(w.document, 'focus', {capture:true}); |
| assert_equals(w.document.activeElement.tagName, 'INPUT'); |
| }, 'An autofocus element in an OBJECT with a load-failed frame should be processed'); |
| |
| promise_test(async t => { |
| let w = await setupBlankWindow(t); |
| w.document.body.innerHTML = '<object data="/media/1x1-green.png"><input autofocus></object>'; |
| await waitUntilStableAutofocusState(w); |
| assert_equals(w.document.activeElement.tagName, 'BODY'); |
| }, 'An autofocus element in an OBJECT with a loaded image should not be processed'); |
| |
| promise_test(async t => { |
| let w = await setupBlankWindow(t); |
| w.document.body.innerHTML = '<object data="/media/non-existent.png"><input autofocus></object>'; |
| await waitForEvent(w.document, 'focus', {capture:true}); |
| assert_equals(w.document.activeElement.tagName, 'INPUT'); |
| }, 'An autofocus element in an OBJECT with a load-failed image should be processed'); |
| |
| promise_test(async t => { |
| let w = await setupBlankWindow(t); |
| w.document.body.innerHTML = `<object id=outer data="/media/non-existent.png"> |
| <object id=inner data="/media/non-existent-2.png"> |
| <input autofocus> |
| </object> |
| </object>`; |
| await waitForEvent(w.document, 'focus', {capture:true}); |
| assert_equals(w.document.activeElement.tagName, 'INPUT'); |
| }, 'An autofocus element in nested OBJECTs with load-failed images should be processed'); |
| </script> |