1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/callback.h"
6 #include "content/browser/web_contents/web_contents_impl.h"
7 #include "content/public/test/content_browser_test.h"
8 #include "content/public/test/content_browser_test_utils.h"
9 #include "content/public/test/test_utils.h"
10 #include "content/shell/browser/shell.h"
11 #include "testing/gtest/include/gtest/gtest.h"
12 #include "ui/accessibility/ax_node.h"
13 #include "ui/accessibility/ax_tree.h"
19 class AXTreeSnapshotWaiter
{
21 AXTreeSnapshotWaiter() : loop_runner_(new MessageLoopRunner()) {}
27 const SimpleAXTreeUpdate
& snapshot() const { return snapshot_
; }
29 void ReceiveSnapshot(const SimpleAXTreeUpdate
& snapshot
) {
35 SimpleAXTreeUpdate snapshot_
;
36 scoped_refptr
<MessageLoopRunner
> loop_runner_
;
38 DISALLOW_COPY_AND_ASSIGN(AXTreeSnapshotWaiter
);
43 class SnapshotAXTreeBrowserTest
: public ContentBrowserTest
{
45 SnapshotAXTreeBrowserTest() {}
46 ~SnapshotAXTreeBrowserTest() override
{}
49 IN_PROC_BROWSER_TEST_F(SnapshotAXTreeBrowserTest
,
50 SnapshotAccessibilityTreeFromWebContents
) {
51 GURL
url("data:text/html,<button>Click</button>");
52 NavigateToURL(shell(), url
);
54 WebContentsImpl
* web_contents
=
55 static_cast<WebContentsImpl
*>(shell()->web_contents());
57 AXTreeSnapshotWaiter waiter
;
58 web_contents
->RequestAXTreeSnapshot(
59 base::Bind(&AXTreeSnapshotWaiter::ReceiveSnapshot
,
60 base::Unretained(&waiter
)));
63 // Dump the whole tree if one of the assertions below fails
64 // to aid in debugging why it failed.
65 SCOPED_TRACE(waiter
.snapshot().ToString());
67 ui::AXTree
tree(waiter
.snapshot());
68 ui::AXNode
* root
= tree
.root();
69 ASSERT_NE(nullptr, root
);
70 ASSERT_EQ(ui::AX_ROLE_ROOT_WEB_AREA
, root
->data().role
);
71 ui::AXNode
* group
= root
->ChildAtIndex(0);
72 ASSERT_EQ(ui::AX_ROLE_GROUP
, group
->data().role
);
73 ui::AXNode
* button
= group
->ChildAtIndex(0);
74 ASSERT_EQ(ui::AX_ROLE_BUTTON
, button
->data().role
);
77 } // namespace content