| <html> |
| <head> |
| <script src="../../http/tests/inspector/resources/protocol-test.js"></script> |
| </head> |
| <body onLoad="runTest()"> |
| |
| <p>Checking Web Inspector protocol for the Accessibility Node Inspector.</p> |
| |
| <div id="examples"> |
| |
| <script class="ex"></script> |
| <script class="ex" style="display:block;"></script> |
| |
| <div class="ex"><div></div></div> |
| |
| <div role="group" class="ex"> |
| <div>foo</div> |
| <span> |
| bar |
| <span role="button">baz</span> |
| </span> |
| <div></div> |
| <div></div> |
| </div> |
| |
| <div class="ex" role="presentation"><div></div></div> |
| <div class="ex"></div> |
| <div class="ex" aria-hidden="true"></div> |
| <span class="ex"></span> |
| <span class="ex" aria-hidden="true"></span> |
| |
| <div role="listbox" class="ex" aria-busy="true"> |
| <!-- Despite having no required option children, this is valid because it is marked as busy. --> |
| <!-- For example, waiting for a script to load its contents. --> |
| </div> |
| |
| <!-- Full coverage of live regions in getAccessibilityPropertiesForNode_liveRegion.html. --> |
| <div class="ex" role="group" aria-live="off">off</div> |
| <div class="ex" role="group" aria-live="polite">polite</div> |
| <div class="ex" role="group" aria-live="assertive" aria-atomic="true">assertive (and atomic)</div> |
| |
| <div class="ex" role="button" tabindex="0"></div> |
| <div class="ex" role="button" tabindex="0" aria-disabled="true">disabled</div> |
| <div class="ex" role="button" tabindex="0" aria-pressed="true">Pressed.</div> |
| <div class="ex" role="button" tabindex="0" aria-pressed="false">Not Pressed.</div> |
| <button class="ex"></button> |
| <input class="ex" type="button"> |
| <div role="button" class="ex" tabindex="0" aria-haspopup="true">Popup Button.</div> |
| |
| <!-- FIXME: Inputs missing parentNodeId http://webkit.org/b/130181 --> |
| <input class="ex"> |
| <input class="ex" required> |
| |
| <!-- Note: These correctly report childNodeIds.length of 1 b/c of their shadow DOM tree. See http://webkit.org/b/130302 --> |
| <input class="ex" aria-required="true" value="required"> |
| <input class="ex" aria-invalid="spelling" value="invalid spelling"> |
| <input class="ex" aria-invalid="foo" value="fake value will eval to true"> |
| <input class="ex" readonly value="readonly"> |
| |
| <div class="ex" role="textbox" tabindex="0" aria-readonly="true">readonly</div> |
| <input class="ex" disabled value="disabled"> |
| <div class="ex" role="textbox" tabindex="0" aria-disabled="true">disabled</div> |
| |
| <input class="ex" type="checkbox"> |
| <input class="ex" type="checkbox" checked> |
| <div class="ex" role="checkbox">unchecked (checked undefined evals to false on checkbox)</div> |
| <div class="ex" role="checkbox" aria-checked="true">checked</div> |
| <div class="ex" role="checkbox" aria-checked="mixed">mixed</div> |
| <div class="ex" role="checkbox" aria-checked="false">unchecked</div> |
| |
| <!-- The 'doc-*' roles are defined the ARIA DPUB mobile: https://www.w3.org/TR/dpub-aam-1.0/ --> |
| <!-- Editor's draft is currently at https://rawgit.com/w3c/aria/master/dpub-aam/dpub-aam.html --> |
| <div role="doc-abstract" class="ex">doc-abstract</div> |
| <div role="doc-acknowledgments" class="ex">doc-acknowledgments</div> |
| <div role="doc-afterword" class="ex">doc-afterword</div> |
| <div role="doc-appendix" class="ex">doc-appendix</div> |
| <div role="doc-backlink" class="ex">doc-backlink</div> |
| <div role="doc-biblioentry" class="ex">doc-biblioentry</div> |
| <div role="doc-bibliography" class="ex">doc-bibliography</div> |
| <div role="doc-biblioref" class="ex">doc-biblioref</div> |
| <div role="doc-chapter" class="ex">doc-chapter</div> |
| <div role="doc-colophon" class="ex">doc-colophon</div> |
| <div role="doc-conclusion" class="ex">doc-conclusion</div> |
| <div role="doc-cover" class="ex">doc-cover</div> |
| <div role="doc-credit" class="ex">doc-credit</div> |
| <div role="doc-credits" class="ex">doc-credits</div> |
| <div role="doc-dedication" class="ex">doc-dedication</div> |
| <div role="doc-endnote" class="ex">doc-endnote</div> |
| <div role="doc-endnotes" class="ex">doc-endnotes</div> |
| <div role="doc-epigraph" class="ex">doc-epigraph</div> |
| <div role="doc-epilogue" class="ex">doc-epilogue</div> |
| <div role="doc-errata" class="ex">doc-errata</div> |
| <div role="doc-example" class="ex">doc-example</div> |
| <div role="doc-footnote" class="ex">doc-footnote</div> |
| <div role="doc-foreword" class="ex">doc-foreword</div> |
| <div role="doc-glossary" class="ex">doc-glossary</div> |
| <div role="doc-glossref" class="ex">doc-glossref</div> |
| <div role="doc-index" class="ex">doc-index</div> |
| <div role="doc-introduction" class="ex">doc-introduction</div> |
| <div role="doc-noteref" class="ex">doc-noteref</div> |
| <div role="doc-notice" class="ex">doc-notice</div> |
| <div role="doc-pagebreak" class="ex">doc-pagebreak</div> |
| <div role="doc-pagelist" class="ex">doc-pagelist</div> |
| <div role="doc-part" class="ex">doc-part</div> |
| <div role="doc-preface" class="ex">doc-preface</div> |
| <div role="doc-prologue" class="ex">doc-prologue</div> |
| <div role="doc-pullquote" class="ex">doc-pullquote</div> |
| <div role="doc-qna" class="ex">doc-qna</div> |
| <div role="doc-subtitle" class="ex">doc-subtitle</div> |
| <div role="doc-tip" class="ex">doc-tip</div> |
| <div role="doc-toc" class="ex">doc-toc</div> |
| |
| <input class="ex" type="radio"> |
| <input class="ex" type="radio" checked> |
| <div class="ex" role="radio">unchecked (checked undefined evals to false on radio)</div> |
| <div class="ex" role="radio" aria-checked="true">checked</div> |
| <div class="ex" role="radio" aria-checked="mixed">unchecked [sic] mixed state will not be exposed on radios per ARIA spec.</div> |
| <div class="ex" role="radio" aria-checked="false">unchecked</div> |
| |
| <input class="ex" aria-hidden="true"> |
| <input class="ex" style="display:none;"> |
| |
| <!-- FIXME: Images missing parentNodeId http://webkit.org/b/130181 --> |
| <img class="ex" src="./404.gif"><!-- img:not([alt]) ignored if it does not load. --> |
| <img class="ex" src="data:image/gif;base64,R0lGODlhEAARAJECAOHh4UpKSgAAAAAAACH5BAEAAAIALAAAAAAQABEAAAIllB8Zx63b4otSUWcvyuz5D4biSD7AiZroWSXa5r7CJNOvra1RAQA7"> |
| <img class="ex" src="data:image/gif;base64,R0lGODlhEAARAJECAOHh4UpKSgAAAAAAACH5BAEAAAIALAAAAAAQABEAAAIllB8Zx63b4otSUWcvyuz5D4biSD7AiZroWSXa5r7CJNOvra1RAQA7" alt=""> |
| <img class="ex" src="data:image/gif;base64,R0lGODlhEAARAJECAOHh4UpKSgAAAAAAACH5BAEAAAIALAAAAAAQABEAAAIllB8Zx63b4otSUWcvyuz5D4biSD7AiZroWSXa5r7CJNOvra1RAQA7" alt="x"> |
| <img class="ex" src="data:image/gif;base64,R0lGODlhEAARAJECAOHh4UpKSgAAAAAAACH5BAEAAAIALAAAAAAQABEAAAIllB8Zx63b4otSUWcvyuz5D4biSD7AiZroWSXa5r7CJNOvra1RAQA7" alt="x" aria-hidden="true"> |
| <img class="ex" src="data:image/gif;base64,R0lGODlhEAARAJECAOHh4UpKSgAAAAAAACH5BAEAAAIALAAAAAAQABEAAAIllB8Zx63b4otSUWcvyuz5D4biSD7AiZroWSXa5r7CJNOvra1RAQA7" alt="x" style="display:none;"> |
| |
| <select multiple id="flowedTo2"> |
| <option class="ex" selected>selected</option> |
| <option class="ex">not selected</option> |
| </select> |
| |
| <select class="ex"> |
| <option>FOO</option> |
| </select> |
| |
| <input class="ex" role="combobox" aria-owns="ownedlistbox invalidIdRef" aria-controls="ownedlistbox invalidIdRef"> |
| <div role="listbox" class="ex" id="ownedlistbox"> |
| <div class="ex" role="option" aria-selected="true">selected</div> |
| <div class="ex" role="option" aria-selected="false">not selected</div> |
| </div> |
| |
| <div role="tablist" class="ex" aria-flowto="flowedTo1 invalidIdRef flowedTo2"> |
| <div class="ex" role="tab" aria-selected="true">selected</div> |
| <div class="ex" role="tab" aria-selected="false">not selected</div> |
| </div> |
| |
| <div role="listbox" class="ex" aria-multiselectable="true"> |
| <div role="option" aria-selected="true">selected</div> |
| <div role="option" aria-selected="false">not selected</div> |
| <div role="option" aria-selected="true">selected</div> |
| </div> |
| |
| <div role="listbox" aria-busy="true"> |
| <div class="ex" role="option">busy (parent)</div> |
| <div class="ex" role="option" aria-busy="true">busy (self)</div> |
| </div> |
| |
| <ul role="tree" class="ex" id="flowedTo1" aria-activedescendant="activedescendant"> |
| <li class="ex" role="treeitem" aria-expanded="true">expanded</li> |
| <li class="ex" role="treeitem" aria-expanded="false" id="activedescendant" aria-selected="true">collapsed</li> |
| <li class="ex" role="treeitem" aria-expanded="undefined">expanded</li> |
| </ul> |
| |
| <div> |
| <h1 class="ex">H1</h1> |
| <h2 class="ex">H2</h2> |
| <h3 class="ex">H3</h3> |
| <h4 class="ex">H4</h4> |
| <h5 class="ex">H5</h5> |
| <h6 class="ex">H6</h6> |
| |
| <h1 class="ex" style="color: red;" aria-level="8">H1</h1> |
| |
| <ul class="ex"> |
| <li class="ex" aria-level="1"> |
| <span>List Item Level 1</span> |
| <ol class="ex"> |
| <li class="ex" aria-level="2">List Item Level 2</li> |
| </ol> |
| </li> |
| <li class="ex" aria-level="1">List Item Level 1</li> |
| </ul> |
| |
| <ul class="ex" role="tree"> |
| <li class="ex" role="treeitem"> |
| <span>Tree Item Level 1</span> |
| <ul class="ex"> |
| <li class="ex" role="treeitem">Tree Item Level 2</li> |
| </ul> |
| </li> |
| </ul> |
| |
| </div> |
| |
| <!-- Full test of mouseEventNodeId in getAccessibilityPropertiesForNode_mouseEventNodeId.html. --> |
| <div class="ex" onclick="void(0);">click</div> |
| |
| </div> |
| |
| <script> |
| |
| function $(selector) { |
| return document.querySelectorAll(selector); |
| } |
| function cleanup() { |
| // Hide the test element container to avoid irrelevant output diffs on subsequent updates. |
| document.getElementById("examples").style.display = "none"; |
| } |
| |
| function test() { |
| |
| var examples = []; |
| var documentNodeId = null; |
| |
| function onGotDocument(response) { |
| InspectorProtocol.checkForError(response); |
| documentNodeId = response.result.root.nodeId; |
| InspectorProtocol.sendCommand("DOM.getAccessibilityPropertiesForNode", {"nodeId": documentNodeId}, onGotAccessibilityPropertiesForDocumentNode); |
| } |
| |
| function onGotAccessibilityPropertiesForDocumentNode(response) { |
| InspectorProtocol.checkForError(response); |
| ProtocolTest.log("#document"); |
| logAccessibilityProperties(response.result.properties); |
| ProtocolTest.log("\n"); |
| InspectorProtocol.sendCommand("DOM.querySelectorAll", {"nodeId": documentNodeId, "selector": ".ex"}, onGotQuerySelectorAll); |
| } |
| |
| function onGotQuerySelectorAll(response) { |
| InspectorProtocol.checkForError(response); |
| examples = response.result.nodeIds; |
| ProtocolTest.log("Total elements to be tested: " + examples.length + "."); |
| loop(); |
| } |
| |
| function loop() { |
| if (examples.length) { |
| InspectorProtocol.sendCommand("DOM.getOuterHTML", {"nodeId": examples[examples.length-1]}, onGotOuterHTML); |
| } else { |
| finishTest(); |
| } |
| } |
| |
| function onGotOuterHTML(response) { |
| InspectorProtocol.checkForError(response); |
| var outerHTML = response.result.outerHTML; |
| outerHTML = outerHTML.replace(/ class="ex"/g, ""); // remove any duplicated, unnecessary class attributes |
| outerHTML = outerHTML.replace(/;base64,.*?"/, "...\""); // suppress full data URIs in output |
| ProtocolTest.log("\n" + outerHTML); |
| InspectorProtocol.sendCommand("DOM.getAccessibilityPropertiesForNode", {"nodeId": examples[examples.length-1]}, onGotAccessibilityProperties); |
| } |
| |
| function onGotAccessibilityProperties(response) { |
| InspectorProtocol.checkForError(response); |
| logAccessibilityProperties(response.result.properties); |
| examples.pop(); |
| loop(); |
| } |
| |
| function logAccessibilityProperties(properties) { |
| for (var key in properties) { |
| var value = properties[key]; |
| switch (key){ |
| case "nodeId": |
| continue; |
| case "activeDescendantNodeId": |
| case "mouseEventNodeId": |
| case "parentNodeId": |
| if (typeof value === "number") |
| ProtocolTest.log(" " + key + ": exists"); |
| break; |
| case "childNodeIds": |
| case "controlledNodeIds": |
| case "flowedNodeIds": |
| case "ownedNodeIds": |
| case "selectedChildNodeIds": |
| if (typeof value === "object" && value.length) |
| ProtocolTest.log(" " + key + ".length: " + value.length); |
| break; |
| default: |
| ProtocolTest.log(" " + key + ": " + value); |
| } |
| } |
| } |
| |
| function finishTest() { |
| InspectorProtocol.sendCommand("Runtime.evaluate", {"expression": "cleanup()"}, function(){ |
| ProtocolTest.completeTest(); |
| }); |
| } |
| |
| |
| |
| InspectorProtocol.sendCommand("DOM.getDocument", {}, onGotDocument); |
| |
| } |
| </script> |
| </body> |
| </html> |