Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / content / browser / accessibility / browser_accessibility_win_unittest.cc
index fad5ad4..ccda978 100644 (file)
@@ -11,7 +11,6 @@
 #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"
@@ -59,7 +58,7 @@ class CountedBrowserAccessibilityFactory : public BrowserAccessibilityFactory {
  private:
   virtual ~CountedBrowserAccessibilityFactory();
 
-  virtual BrowserAccessibility* Create() OVERRIDE;
+  virtual BrowserAccessibility* Create() override;
 
   DISALLOW_COPY_AND_ASSIGN(CountedBrowserAccessibilityFactory);
 };
@@ -90,7 +89,7 @@ class BrowserAccessibilityTest : public testing::Test {
   virtual ~BrowserAccessibilityTest();
 
  private:
-  virtual void SetUp() OVERRIDE;
+  virtual void SetUp() override;
 
   DISALLOW_COPY_AND_ASSIGN(BrowserAccessibilityTest);
 };
@@ -141,8 +140,8 @@ TEST_F(BrowserAccessibilityTest, TestNoLeaks) {
   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.
@@ -152,8 +151,8 @@ TEST_F(BrowserAccessibilityTest, TestNoLeaks) {
   // 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();
@@ -202,8 +201,8 @@ TEST_F(BrowserAccessibilityTest, TestChildrenChange) {
   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.
@@ -235,7 +234,7 @@ TEST_F(BrowserAccessibilityTest, TestChildrenChange) {
   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);
@@ -298,8 +297,8 @@ TEST_F(BrowserAccessibilityTest, TestChildrenChangeNoLeaks) {
   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
@@ -307,7 +306,7 @@ TEST_F(BrowserAccessibilityTest, TestChildrenChangeNoLeaks) {
   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);
@@ -342,8 +341,8 @@ TEST_F(BrowserAccessibilityTest, TestTextBoundaries) {
   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 =
@@ -442,8 +441,8 @@ TEST_F(BrowserAccessibilityTest, TestSimpleHypertext) {
   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 =
@@ -532,11 +531,10 @@ TEST_F(BrowserAccessibilityTest, TestComplexHypertext) {
   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 =
@@ -605,22 +603,18 @@ TEST_F(BrowserAccessibilityTest, TestCreateEmptyDocument) {
   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;
@@ -637,20 +631,20 @@ TEST_F(BrowserAccessibilityTest, TestCreateEmptyDocument) {
   params.push_back(AccessibilityHostMsg_EventParams());
   AccessibilityHostMsg_EventParams* msg = &params[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;
@@ -662,79 +656,51 @@ TEST_F(BrowserAccessibilityTest, TestCreateEmptyDocument) {
   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