| <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> |
| <html> |
| <head> |
| <script src="../resources/accessibility-helper.js"></script> |
| <script src="../resources/js-test.js"></script> |
| </head> |
| <body> |
| |
| <div id="container" role="group"></div> |
| <canvas id="canvas" tabindex="-1"></canvas> |
| |
| <script> |
| var testOutput = "This test makes sure that AccessibilityNodeObjects are properly detached when the node they point to is reparented to a location that allows them to have a renderer.\n\n"; |
| |
| if (window.accessibilityController) { |
| window.jsTestIsAsync = true; |
| |
| // Create an ordinary button on the page. |
| var button = document.createElement("button"); |
| button.id = "buttonOne"; |
| document.body.appendChild(button); |
| |
| setTimeout(async function() { |
| window.axElement = await waitForElementById("buttonOne"); |
| window.expectedButtonRole = axElement.role; |
| |
| // Now remove the node from the tree and get the role of the detached accessibility object. |
| document.body.removeChild(button); |
| await waitFor(() => { |
| window.expectedDetachedRole = axElement.role; |
| return expectedButtonRole !== expectedDetachedRole; |
| }); |
| testOutput += expect("expectedButtonRole !== expectedDetachedRole", "true"); |
| |
| // This time create a button that's a child of a canvas element. It will be focusable but not rendered. |
| // In particular, this will create an AccessibilityNodeObject rather than an AccessibilityRenderObject. |
| var canvas = document.getElementById("canvas"); |
| // This test relies on focusing the canvas to make it accessible (without the focus, accessibleElementById("canvas") |
| // below will never return anything). |
| canvas.focus(); |
| var canvasButton = document.createElement("button"); |
| canvas.appendChild(canvasButton); |
| |
| var axCanvas; |
| await waitFor(() => { |
| axCanvas = accessibilityController.accessibleElementById("canvas"); |
| return axCanvas && axCanvas.childrenCount > 0; |
| }); |
| window.axElement = axCanvas.childAtIndex(0); |
| window.canvasButtonRole = axElement.role; |
| testOutput += expect("canvasButtonRole", "expectedButtonRole"); |
| |
| // Now reparent the node to a container that's not a canvas. |
| var container = document.getElementById("container"); |
| container.appendChild(canvasButton); |
| var axContainer = accessibilityController.accessibleElementById("container"); |
| await waitFor(() => axContainer.childrenCount > 0); |
| window.axReparentedElement = axContainer.childAtIndex(0); |
| |
| // Ensure that the old accessibility object is detached by checking its role. |
| await waitFor(() => { |
| window.detachedCanvasButtonRole = axElement.role; |
| return detachedCanvasButtonRole === expectedDetachedRole; |
| }); |
| testOutput += expect("detachedCanvasButtonRole", "expectedDetachedRole"); |
| |
| // Ensure that the new accessibility object for the now-reparented node has the correct role. |
| window.reparentedButtonRole = axReparentedElement.role; |
| testOutput += expect("reparentedButtonRole", "expectedButtonRole"); |
| |
| debug(testOutput); |
| finishJSTest(); |
| }, 0); |
| } |
| </script> |
| </body> |
| </html> |
| |