Commit a0e9446b authored by Alexander Surkov's avatar Alexander Surkov Committed by Commit Bot

ax_dump_tree tool: add --pid command line argument on Mac/Linux to dump...

ax_dump_tree tool: add --pid command line argument on Mac/Linux to dump accessible tree by process id

Bug: None
Change-Id: Ie374dfb692757f1106d81cfbde652ac31e8c9db9
AX-Relnotes: n/a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2410121
Commit-Queue: Alexander Surkov <asurkov@igalia.com>
Reviewed-by: default avatarDominic Mazzoni <dmazzoni@chromium.org>
Cr-Commit-Position: refs/heads/master@{#807569}
parent 2a8af7e5
...@@ -22,9 +22,13 @@ This tool helps to inspect accessibility trees of applications. Trees are dumped ...@@ -22,9 +22,13 @@ This tool helps to inspect accessibility trees of applications. Trees are dumped
### Run ### Run
To dump accessibility tree of application, run On Windows run
`ax_dump_tree --window=id` `ax_dump_tree --window=id`
where `id` is HWND on Windows, PID on Linux and Mac. where `id` is HWND of a window to dump accessible tree for.
On Mac and Linux, run
`ax_dump_tree --pid=id`
where `pid` is process id of an application to dump accessible tree for.
Alternatively, you can indicate an application by its title: Alternatively, you can indicate an application by its title:
`ax_dump_tree --pattern=title` `ax_dump_tree --pattern=title`
...@@ -32,7 +36,7 @@ Alternatively, you can indicate an application by its title: ...@@ -32,7 +36,7 @@ Alternatively, you can indicate an application by its title:
Notes: Notes:
* To use a hex window handle prefix it with `0x`. * To use a hex window handle prefix it with `0x`.
* For json output, use the `--json` option * For json output, use the `--json` option
* To filter certain properties, use `--filters=[path-to-filters.txt]` where the filters text file has a series of `@ALLOW` and/or `@DENY` lines. See example-tree-filters.txt in tools/accessibility/inspect. * To filter certain properties, use `--filters=[absolute-path-to-filters.txt]` where the filters text file has a series of `@ALLOW` and/or `@DENY` lines. See example-tree-filters.txt in tools/accessibility/inspect.
* [Mac] You have to turn on Accessibility for Terminal in Security & Privacy System Preferences. * [Mac] You have to turn on Accessibility for Terminal in Security & Privacy System Preferences.
## Convenience PowerShell scripts ## Convenience PowerShell scripts
......
...@@ -12,10 +12,16 @@ ...@@ -12,10 +12,16 @@
#include "build/build_config.h" #include "build/build_config.h"
#include "tools/accessibility/inspect/ax_tree_server.h" #include "tools/accessibility/inspect/ax_tree_server.h"
char kWindowSwitch[] = "window"; char kIdSwitch[] =
#if defined(WINDOWS)
"window";
#else
"pid";
#endif
char kPatternSwitch[] = "pattern"; char kPatternSwitch[] = "pattern";
char kFiltersSwitch[] = "filters"; char kFiltersSwitch[] = "filters";
char kJsonSwitch[] = "json"; char kJsonSwitch[] = "json";
char kHelpSwitch[] = "help";
// Convert from string to int, whether in 0x hex format or decimal format. // Convert from string to int, whether in 0x hex format or decimal format.
bool StringToInt(std::string str, unsigned* result) { bool StringToInt(std::string str, unsigned* result) {
...@@ -44,46 +50,67 @@ gfx::AcceleratedWidget CastToAcceleratedWidget(unsigned window_id) { ...@@ -44,46 +50,67 @@ gfx::AcceleratedWidget CastToAcceleratedWidget(unsigned window_id) {
#endif #endif
} }
void PrintHelp() {
printf(
"ax_dump_tree is a tool designed to dump platform accessible trees "
"of running applications.\n");
printf("\nusage: ax_dump_tree <options>\n");
printf("options:\n");
#if defined(WINDOWS)
printf(" --window\tHWND of a window to dump accessible tree for\n");
#else
printf(
" --pid\t\tprocess id of an application to dump accessible tree for\n");
#endif
printf(" --pattern\ttitle of an application to dump accessible tree for\n");
printf(
" --filters\tfile containing property filters used to filter out\n"
" \t\taccessible tree, see example-tree-filters.txt as an example\n");
printf(" --json\toutputs tree in JSON format\n");
}
int main(int argc, char** argv) { int main(int argc, char** argv) {
logging::SetLogMessageHandler(AXDumpTreeLogMessageHandler); logging::SetLogMessageHandler(AXDumpTreeLogMessageHandler);
base::AtExitManager at_exit_manager; base::AtExitManager at_exit_manager;
base::CommandLine::Init(argc, argv); base::CommandLine::Init(argc, argv);
const base::CommandLine* command_line =
base::CommandLine::ForCurrentProcess();
if (command_line->HasSwitch(kHelpSwitch)) {
PrintHelp();
return 0;
}
base::FilePath filters_path = base::FilePath filters_path =
base::CommandLine::ForCurrentProcess()->GetSwitchValuePath( command_line->GetSwitchValuePath(kFiltersSwitch);
kFiltersSwitch);
bool use_json = command_line->HasSwitch(kJsonSwitch);
bool use_json =
base::CommandLine::ForCurrentProcess()->HasSwitch(kJsonSwitch); std::string id_str = command_line->GetSwitchValueASCII(kIdSwitch);
if (!id_str.empty()) {
std::string window_str = unsigned hwnd_or_pid;
base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( if (!StringToInt(id_str, &hwnd_or_pid)) {
kWindowSwitch);
if (!window_str.empty()) {
unsigned window_id;
if (!StringToInt(window_str, &window_id)) {
LOG(ERROR) << "* Error: Could not convert window id string to integer."; LOG(ERROR) << "* Error: Could not convert window id string to integer.";
return 1; return 1;
} }
gfx::AcceleratedWidget widget(CastToAcceleratedWidget(window_id)); gfx::AcceleratedWidget widget(CastToAcceleratedWidget(hwnd_or_pid));
std::unique_ptr<content::AXTreeServer> server( std::unique_ptr<content::AXTreeServer> server(
new content::AXTreeServer(widget, filters_path, use_json)); new content::AXTreeServer(widget, filters_path, use_json));
return 0; return 0;
} }
std::string pattern_str = std::string pattern_str = command_line->GetSwitchValueASCII(kPatternSwitch);
base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
kPatternSwitch);
if (!pattern_str.empty()) { if (!pattern_str.empty()) {
std::unique_ptr<content::AXTreeServer> server( std::unique_ptr<content::AXTreeServer> server(
new content::AXTreeServer(pattern_str, filters_path, use_json)); new content::AXTreeServer(pattern_str, filters_path, use_json));
return 0; return 0;
} }
LOG(ERROR) << "* Error: Neither window handle (--window=[window-handle]) " LOG(ERROR)
"nor pattern (--pattern=[pattern]) provided."; << "* Error: no accessible tree was identified to dump. Run with --help "
"for help.";
return 1; return 1;
} }
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