#include "content/browser/accessibility/browser_accessibility_manager_win.h"
#include "content/browser/accessibility/browser_accessibility_state_impl.h"
#include "content/browser/accessibility/browser_accessibility_win.h"
-#include "content/browser/renderer_host/legacy_render_widget_host_win.h"
#include "content/common/accessibility_messages.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/win/atl_module.h"
private:
virtual ~CountedBrowserAccessibilityFactory();
- virtual BrowserAccessibility* Create() OVERRIDE;
+ virtual BrowserAccessibility* Create() override;
DISALLOW_COPY_AND_ASSIGN(CountedBrowserAccessibilityFactory);
};
virtual ~BrowserAccessibilityTest();
private:
- virtual void SetUp() OVERRIDE;
+ virtual void SetUp() override;
DISALLOW_COPY_AND_ASSIGN(BrowserAccessibilityTest);
};
CountedBrowserAccessibility::reset();
scoped_ptr<BrowserAccessibilityManager> manager(
BrowserAccessibilityManager::Create(
- root, NULL, new CountedBrowserAccessibilityFactory()));
- manager->UpdateNodesForTesting(button, checkbox);
+ MakeAXTreeUpdate(root, button, checkbox),
+ NULL, new CountedBrowserAccessibilityFactory()));
ASSERT_EQ(3, CountedBrowserAccessibility::num_instances());
// Delete the manager and test that all 3 instances are deleted.
// Construct a manager again, and this time use the IAccessible interface
// to get new references to two of the three nodes in the tree.
manager.reset(BrowserAccessibilityManager::Create(
- root, NULL, new CountedBrowserAccessibilityFactory()));
- manager->UpdateNodesForTesting(button, checkbox);
+ MakeAXTreeUpdate(root, button, checkbox),
+ NULL, new CountedBrowserAccessibilityFactory()));
ASSERT_EQ(3, CountedBrowserAccessibility::num_instances());
IAccessible* root_accessible =
manager->GetRoot()->ToBrowserAccessibilityWin();
CountedBrowserAccessibility::reset();
scoped_ptr<BrowserAccessibilityManager> manager(
BrowserAccessibilityManager::Create(
- root, NULL, new CountedBrowserAccessibilityFactory()));
- manager->UpdateNodesForTesting(text);
+ MakeAXTreeUpdate(root, text),
+ NULL, new CountedBrowserAccessibilityFactory()));
// Query for the text IAccessible and verify that it returns "old text" as its
// value.
text2.SetName("old text");
AccessibilityHostMsg_EventParams param;
param.event_type = ui::AX_EVENT_CHILDREN_CHANGED;
- param.nodes.push_back(text2);
+ param.update.nodes.push_back(text2);
param.id = text2.id;
std::vector<AccessibilityHostMsg_EventParams> events;
events.push_back(param);
CountedBrowserAccessibility::reset();
scoped_ptr<BrowserAccessibilityManager> manager(
BrowserAccessibilityManager::Create(
- root, NULL, new CountedBrowserAccessibilityFactory()));
- manager->UpdateNodesForTesting(div, text3, text4);
+ MakeAXTreeUpdate(root, div, text3, text4),
+ NULL, new CountedBrowserAccessibilityFactory()));
ASSERT_EQ(4, CountedBrowserAccessibility::num_instances());
// Notify the BrowserAccessibilityManager that the div node and its children
root.child_ids.clear();
AccessibilityHostMsg_EventParams param;
param.event_type = ui::AX_EVENT_CHILDREN_CHANGED;
- param.nodes.push_back(root);
+ param.update.nodes.push_back(root);
param.id = root.id;
std::vector<AccessibilityHostMsg_EventParams> events;
events.push_back(param);
CountedBrowserAccessibility::reset();
scoped_ptr<BrowserAccessibilityManager> manager(
BrowserAccessibilityManager::Create(
- root, NULL, new CountedBrowserAccessibilityFactory()));
- manager->UpdateNodesForTesting(text1);
+ MakeAXTreeUpdate(root, text1),
+ NULL, new CountedBrowserAccessibilityFactory()));
ASSERT_EQ(2, CountedBrowserAccessibility::num_instances());
BrowserAccessibilityWin* root_obj =
CountedBrowserAccessibility::reset();
scoped_ptr<BrowserAccessibilityManager> manager(
BrowserAccessibilityManager::Create(
- root, NULL, new CountedBrowserAccessibilityFactory()));
- manager->UpdateNodesForTesting(root, text1, text2);
+ MakeAXTreeUpdate(root, root, text1, text2),
+ NULL, new CountedBrowserAccessibilityFactory()));
ASSERT_EQ(3, CountedBrowserAccessibility::num_instances());
BrowserAccessibilityWin* root_obj =
CountedBrowserAccessibility::reset();
scoped_ptr<BrowserAccessibilityManager> manager(
BrowserAccessibilityManager::Create(
- root, NULL, new CountedBrowserAccessibilityFactory()));
- manager->UpdateNodesForTesting(root,
- text1, button1, button1_text,
- text2, link1, link1_text);
-
+ MakeAXTreeUpdate(root,
+ text1, button1, button1_text,
+ text2, link1, link1_text),
+ NULL, new CountedBrowserAccessibilityFactory()));
ASSERT_EQ(7, CountedBrowserAccessibility::num_instances());
BrowserAccessibilityWin* root_obj =
CountedBrowserAccessibility::reset();
const int32 busy_state = 1 << ui::AX_STATE_BUSY;
const int32 readonly_state = 1 << ui::AX_STATE_READ_ONLY;
- const int32 enabled_state = 1 << blink::WebAXStateEnabled;
- scoped_ptr<content::LegacyRenderWidgetHostHWND> accessible_hwnd(
- content::LegacyRenderWidgetHostHWND::Create(GetDesktopWindow()));
+ const int32 enabled_state = 1 << ui::AX_STATE_ENABLED;
scoped_ptr<BrowserAccessibilityManager> manager(
new BrowserAccessibilityManagerWin(
- accessible_hwnd.get(),
- NULL,
BrowserAccessibilityManagerWin::GetEmptyDocument(),
NULL,
new CountedBrowserAccessibilityFactory()));
// Verify the root is as we expect by default.
BrowserAccessibility* root = manager->GetRoot();
- EXPECT_EQ(0, root->renderer_id());
- EXPECT_EQ(ui::AX_ROLE_ROOT_WEB_AREA, root->role());
- EXPECT_EQ(busy_state | readonly_state | enabled_state, root->state());
+ EXPECT_EQ(0, root->GetId());
+ EXPECT_EQ(ui::AX_ROLE_ROOT_WEB_AREA, root->GetRole());
+ EXPECT_EQ(busy_state | readonly_state | enabled_state, root->GetState());
// Tree with a child textfield.
ui::AXNodeData tree1_1;
params.push_back(AccessibilityHostMsg_EventParams());
AccessibilityHostMsg_EventParams* msg = ¶ms[0];
msg->event_type = ui::AX_EVENT_LOAD_COMPLETE;
- msg->nodes.push_back(tree1_1);
- msg->nodes.push_back(tree1_2);
+ msg->update.nodes.push_back(tree1_1);
+ msg->update.nodes.push_back(tree1_2);
msg->id = tree1_1.id;
manager->OnAccessibilityEvents(params);
// Save for later comparison.
- BrowserAccessibility* acc1_2 = manager->GetFromRendererID(2);
+ BrowserAccessibility* acc1_2 = manager->GetFromID(2);
// Verify the root has changed.
EXPECT_NE(root, manager->GetRoot());
// And the proper child remains.
- EXPECT_EQ(ui::AX_ROLE_TEXT_FIELD, acc1_2->role());
- EXPECT_EQ(2, acc1_2->renderer_id());
+ EXPECT_EQ(ui::AX_ROLE_TEXT_FIELD, acc1_2->GetRole());
+ EXPECT_EQ(2, acc1_2->GetId());
// Tree with a child button.
ui::AXNodeData tree2_1;
tree2_2.id = 3;
tree2_2.role = ui::AX_ROLE_BUTTON;
- msg->nodes.clear();
- msg->nodes.push_back(tree2_1);
- msg->nodes.push_back(tree2_2);
+ msg->update.nodes.clear();
+ msg->update.nodes.push_back(tree2_1);
+ msg->update.nodes.push_back(tree2_2);
msg->id = tree2_1.id;
// Fire another load complete.
manager->OnAccessibilityEvents(params);
- BrowserAccessibility* acc2_2 = manager->GetFromRendererID(3);
+ BrowserAccessibility* acc2_2 = manager->GetFromID(3);
// Verify the root has changed.
EXPECT_NE(root, manager->GetRoot());
// And the new child exists.
- EXPECT_EQ(ui::AX_ROLE_BUTTON, acc2_2->role());
- EXPECT_EQ(3, acc2_2->renderer_id());
+ EXPECT_EQ(ui::AX_ROLE_BUTTON, acc2_2->GetRole());
+ EXPECT_EQ(3, acc2_2->GetId());
// Ensure we properly cleaned up.
manager.reset();
ASSERT_EQ(0, CountedBrowserAccessibility::num_instances());
}
-TEST(BrowserAccessibilityManagerWinTest, TestAccessibleHWND) {
- HWND desktop_hwnd = GetDesktopWindow();
- base::win::ScopedComPtr<IAccessible> desktop_hwnd_iaccessible;
- ASSERT_EQ(S_OK, AccessibleObjectFromWindow(
- desktop_hwnd, OBJID_CLIENT,
- IID_IAccessible,
- reinterpret_cast<void**>(desktop_hwnd_iaccessible.Receive())));
-
- scoped_ptr<content::LegacyRenderWidgetHostHWND> accessible_hwnd(
- content::LegacyRenderWidgetHostHWND::Create(GetDesktopWindow()));
-
+// This is a regression test for a bug where the initial empty document
+// loaded by a BrowserAccessibilityManagerWin couldn't be looked up by
+// its UniqueIDWin, because the AX Tree was loaded in
+// BrowserAccessibilityManager code before BrowserAccessibilityManagerWin
+// was initialized.
+TEST_F(BrowserAccessibilityTest, EmptyDocHasUniqueIdWin) {
scoped_ptr<BrowserAccessibilityManagerWin> manager(
new BrowserAccessibilityManagerWin(
- accessible_hwnd.get(),
- desktop_hwnd_iaccessible,
- BrowserAccessibilityManagerWin::GetEmptyDocument(),
- NULL));
- ASSERT_EQ(desktop_hwnd, manager->parent_hwnd());
-
- // Enabling screen reader support and calling MaybeCallNotifyWinEvent
- // should trigger creating the AccessibleHWND, and we should now get a
- // new parent_hwnd with the right window class to fool older screen
- // readers.
- BrowserAccessibilityStateImpl::GetInstance()->OnScreenReaderDetected();
- manager->MaybeCallNotifyWinEvent(0, 0);
- HWND new_parent_hwnd = manager->parent_hwnd();
- ASSERT_NE(desktop_hwnd, new_parent_hwnd);
- WCHAR hwnd_class_name[256];
- ASSERT_NE(0, GetClassName(new_parent_hwnd, hwnd_class_name, 256));
- ASSERT_STREQ(L"Chrome_RenderWidgetHostHWND", hwnd_class_name);
-
- // Destroy the hwnd explicitly; that should trigger clearing parent_hwnd().
- DestroyWindow(new_parent_hwnd);
- ASSERT_EQ(NULL, manager->parent_hwnd());
-
- // Now create it again.
- accessible_hwnd = content::LegacyRenderWidgetHostHWND::Create(
- GetDesktopWindow());
- manager.reset(
- new BrowserAccessibilityManagerWin(
- accessible_hwnd.get(),
- desktop_hwnd_iaccessible,
BrowserAccessibilityManagerWin::GetEmptyDocument(),
- NULL));
- manager->MaybeCallNotifyWinEvent(0, 0);
- new_parent_hwnd = manager->parent_hwnd();
- ASSERT_FALSE(NULL == new_parent_hwnd);
-
- // This time, destroy the manager first, make sure the AccessibleHWND doesn't
- // crash on destruction (to be caught by SyzyASAN or other tools).
- manager.reset(NULL);
+ NULL,
+ new CountedBrowserAccessibilityFactory()));
+
+ // Verify the root is as we expect by default.
+ BrowserAccessibility* root = manager->GetRoot();
+ EXPECT_EQ(0, root->GetId());
+ EXPECT_EQ(ui::AX_ROLE_ROOT_WEB_AREA, root->GetRole());
+ EXPECT_EQ(1 << ui::AX_STATE_BUSY |
+ 1 << ui::AX_STATE_READ_ONLY |
+ 1 << ui::AX_STATE_ENABLED,
+ root->GetState());
+
+ LONG unique_id_win = root->ToBrowserAccessibilityWin()->unique_id_win();
+ ASSERT_EQ(root, manager->GetFromUniqueIdWin(unique_id_win));
}
} // namespace content