Commit 9df875a4 authored by James Wallace-Lee's avatar James Wallace-Lee Committed by Commit Bot

chrome://accessibility: Show native UI AX tree for all windows

Show the native UI's accessibility tree for all open chrome windows
in chrome://accessibility

Change-Id: I119ac76f406010b9b2711de845aa3ace7ef69f5f
Bug: 785493
Reviewed-on: https://chromium-review.googlesource.com/1147511
Commit-Queue: James Wallace-Lee <jamwalla@chromium.org>
Reviewed-by: default avatarDominic Mazzoni <dmazzoni@chromium.org>
Cr-Commit-Position: refs/heads/master@{#578709}
parent 4fb8ae87
......@@ -14,7 +14,11 @@
#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
#include "build/build_config.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/webui_url_constants.h"
#include "chrome/grit/browser_resources.h"
......@@ -387,15 +391,25 @@ void AccessibilityUIMessageHandler::RequestWebContentsTree(
void AccessibilityUIMessageHandler::RequestNativeUITree(
const base::ListValue* args) {
AllowJavascript();
content::WebContents* web_contents = web_ui()->GetWebContents();
gfx::NativeWindow native_window = web_contents->GetTopLevelNativeWindow();
ui::AXPlatformNode* node =
ui::AXPlatformNode::FromNativeWindow(native_window);
std::string str = RecursiveDumpAXPlatformNodeAsString(node, 0);
std::unique_ptr<base::DictionaryValue> result(new base::DictionaryValue());
result->SetString("tree", str);
CallJavascriptFunction("accessibility.showNativeUITree", *(result.get()));
base::Value browser_list(base::Value::Type::LIST);
#if !defined(OS_ANDROID)
for (Browser* browser : *BrowserList::GetInstance()) {
base::Value browser_tree(base::Value::Type::DICTIONARY);
browser_tree.SetKey("id", base::Value(browser->session_id().id()));
browser_tree.SetKey(
"title", base::Value(browser->GetWindowTitleForCurrentTab(false)));
gfx::NativeWindow native_window = browser->window()->GetNativeWindow();
ui::AXPlatformNode* node =
ui::AXPlatformNode::FromNativeWindow(native_window);
browser_tree.SetKey(
"tree", base::Value(RecursiveDumpAXPlatformNodeAsString(node, 0)));
browser_list.GetList().push_back(std::move(browser_tree));
}
#endif // !defined(OS_ANDROID)
CallJavascriptFunction("accessibility.showNativeUITree", browser_list);
}
// static
......
......@@ -246,12 +246,46 @@ cr.define('accessibility', function() {
// Called from C++
function showNativeUITree(data) {
var treeElement = document.querySelector('#native_ui pre');
if (!treeElement) {
var treeElement = document.createElement('pre');
$('native_ui').appendChild(treeElement);
var treeContainer = document.querySelector('#native_ui div');
if (!treeContainer) {
var treeContainer = document.createElement('div');
$('native_ui').appendChild(treeContainer);
}
treeElement.textContent = data.tree;
var dstIds =
new Set(Array.prototype.map.call(treeContainer.children, el => el.id));
data.forEach(function(browser) {
var srcId = 'browser_' + browser.id;
if (dstIds.has(srcId)) {
// Update browser windows in place.
dstIds.delete(srcId);
var title = document.querySelector('#' + srcId + ' summary');
title.textContent = browser.title;
var tree = document.querySelector('#' + srcId + ' pre');
tree.textContent = browser.tree;
} else {
// Add new browser windows.
var browserElement = createNativeUITreeElement(browser);
treeContainer.appendChild(browserElement);
}
});
dstIds.forEach(function(dstId) {
// Remove browser windows that no longer exist.
var browserElement = document.querySelector('#' + dstId);
treeContainer.removeChild(browserElement);
});
}
function createNativeUITreeElement(browser) {
var details = document.createElement('details');
var summary = document.createElement('summary');
var treeElement = document.createElement('pre');
summary.textContent = browser.title;
treeElement.textContent = browser.tree;
details.id = 'browser_' + browser.id;
details.appendChild(summary);
details.appendChild(treeElement);
return details;
}
function createAccessibilityTreeElement(data) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment