Index: content/browser/accessibility/frame_tree_accessibility_unittest.cc |
diff --git a/content/browser/accessibility/frame_tree_accessibility_unittest.cc b/content/browser/accessibility/frame_tree_accessibility_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6aa02d82580bc173909064970629facd2a70aca8 |
--- /dev/null |
+++ b/content/browser/accessibility/frame_tree_accessibility_unittest.cc |
@@ -0,0 +1,177 @@ |
+// Copyright (c) 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/strings/string16.h" |
+#include "base/strings/utf_string_conversions.h" |
+#include "content/browser/accessibility/browser_accessibility.h" |
+#include "content/browser/accessibility/browser_accessibility_manager.h" |
+#include "content/browser/accessibility/frame_tree_accessibility.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace content { |
+namespace { |
+ |
+class TestBrowserAccessibilityDelegate |
+ : public BrowserAccessibilityDelegate { |
+ public: |
+ virtual void AccessibilitySetFocus(int acc_obj_id) OVERRIDE {} |
+ virtual void AccessibilityDoDefaultAction(int acc_obj_id) OVERRIDE {} |
+ virtual void AccessibilityShowMenu(int acc_obj_id) OVERRIDE {} |
+ virtual void AccessibilityScrollToMakeVisible( |
+ int acc_obj_id, gfx::Rect subfocus) OVERRIDE {} |
+ virtual void AccessibilityScrollToPoint( |
+ int acc_obj_id, gfx::Point point) OVERRIDE {} |
+ virtual void AccessibilitySetTextSelection( |
+ int acc_obj_id, int start_offset, int end_offset) OVERRIDE {} |
+ virtual bool AccessibilityViewHasFocus() const OVERRIDE { |
+ return false; |
+ } |
+ virtual gfx::Rect AccessibilityGetViewBounds() const OVERRIDE { |
+ return gfx::Rect(); |
+ } |
+ virtual gfx::Point AccessibilityOriginInScreen( |
+ const gfx::Rect& bounds) const OVERRIDE { |
+ return gfx::Point(); |
+ } |
+ virtual void AccessibilityFatalError() OVERRIDE { |
+ LOG(FATAL) << "Fatal error, aborting test"; |
+ } |
+}; |
+ |
+} // anonymous namespace |
+ |
+// |
+// All of these tests use the same web page spanning two frames: |
+// |
+// Outer Frame: |
+// |
+// 1 AX_ROLE_ROOT_WEB_AREA |
+// 2 AX_ROLE_IFRAME |
+// |
+// Inner Frame: |
+// |
+// 1 AX_ROLE_ROOT_WEB_AREA |
+// 2 AX_ROLE_BUTTON |
+// |
+class FrameTreeAccessibilityTest : public testing::Test { |
+ public: |
+ FrameTreeAccessibilityTest(); |
+ virtual ~FrameTreeAccessibilityTest(); |
+ |
+ protected: |
+ virtual void SetUp() OVERRIDE; |
+ void LinkFrames(); |
+ |
+ TestBrowserAccessibilityDelegate outer_frame_; |
+ TestBrowserAccessibilityDelegate inner_frame_; |
+ scoped_ptr<BrowserAccessibilityManager> outer_manager_; |
+ scoped_ptr<BrowserAccessibilityManager> inner_manager_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(FrameTreeAccessibilityTest); |
+}; |
+ |
+FrameTreeAccessibilityTest::FrameTreeAccessibilityTest() { |
+} |
+ |
+FrameTreeAccessibilityTest::~FrameTreeAccessibilityTest() { |
+} |
+ |
+void FrameTreeAccessibilityTest::SetUp() { |
+ ui::AXNodeData outer_root; |
+ outer_root.id = 1; |
+ outer_root.role = ui::AX_ROLE_ROOT_WEB_AREA; |
+ outer_root.state = 0; |
+ outer_root.child_ids.push_back(2); |
+ |
+ ui::AXNodeData outer_iframe; |
+ outer_iframe.id = 2; |
+ outer_iframe.role = ui::AX_ROLE_IFRAME; |
+ outer_iframe.state = 0; |
+ |
+ outer_manager_.reset(BrowserAccessibilityManager::Create( |
+ MakeAXTreeUpdate(outer_root, outer_iframe), &outer_frame_)); |
+ |
+ ui::AXNodeData inner_root; |
+ inner_root.id = 1; |
+ inner_root.role = ui::AX_ROLE_ROOT_WEB_AREA; |
+ inner_root.state = 0; |
+ inner_root.child_ids.push_back(2); |
+ |
+ ui::AXNodeData inner_button; |
+ inner_button.id = 2; |
+ inner_button.role = ui::AX_ROLE_BUTTON; |
+ inner_button.state = 0; |
+ |
+ inner_manager_.reset(BrowserAccessibilityManager::Create( |
+ MakeAXTreeUpdate(inner_root, inner_button), &inner_frame_)); |
+ |
+ FrameTreeAccessibility* frames = FrameTreeAccessibility::GetInstance(); |
+ frames->OnFrameCreated(&outer_frame_); |
+ frames->SetFrameAccessibilityManager(&outer_frame_, outer_manager_.get()); |
+ frames->OnFrameCreated(&inner_frame_); |
+ frames->SetFrameAccessibilityManager(&inner_frame_, inner_manager_.get()); |
+} |
+ |
+void FrameTreeAccessibilityTest::LinkFrames() { |
+ FrameTreeAccessibility* frames = FrameTreeAccessibility::GetInstance(); |
+ BrowserAccessibility* outer_root = outer_manager_->GetRoot(); |
+ BrowserAccessibility* outer_iframe = outer_root->PlatformGetChild(0); |
+ outer_iframe->SetChildFrameId(frames->GetFrameId(&inner_frame_)); |
+ inner_manager_->SetParentFrameIds( |
+ frames->GetFrameId(&outer_frame_), |
+ outer_iframe->GetId()); |
+} |
+ |
+TEST_F(FrameTreeAccessibilityTest, GetChildAndGetParent) { |
+ BrowserAccessibility* outer_root = outer_manager_->GetRoot(); |
+ BrowserAccessibility* outer_iframe = outer_root->PlatformGetChild(0); |
+ ASSERT_EQ(0U, outer_iframe->PlatformChildCount()); |
+ |
+ LinkFrames(); |
+ |
+ ASSERT_EQ(1U, outer_iframe->PlatformChildCount()); |
+ BrowserAccessibility* inner_root = outer_iframe->PlatformGetChild(0); |
+ ASSERT_EQ(ui::AX_ROLE_ROOT_WEB_AREA, inner_root->GetRole()); |
+ |
+ BrowserAccessibility* inner_root_parent = inner_root->GetParent(); |
+ ASSERT_EQ(inner_root_parent, outer_iframe); |
+} |
+ |
+TEST_F(FrameTreeAccessibilityTest, IsDescendantOf) { |
+ LinkFrames(); |
+ BrowserAccessibility* outer_root = outer_manager_->GetRoot(); |
+ BrowserAccessibility* outer_iframe = outer_root->PlatformGetChild(0); |
+ BrowserAccessibility* inner_root = inner_manager_->GetRoot(); |
+ BrowserAccessibility* inner_button = inner_root->PlatformGetChild(0); |
+ |
+ EXPECT_TRUE(outer_iframe->IsDescendantOf(outer_root)); |
+ EXPECT_TRUE(inner_root->IsDescendantOf(outer_root)); |
+ EXPECT_TRUE(inner_button->IsDescendantOf(outer_root)); |
+ EXPECT_TRUE(inner_root->IsDescendantOf(outer_iframe)); |
+ EXPECT_TRUE(inner_button->IsDescendantOf(outer_iframe)); |
+ |
+ EXPECT_FALSE(outer_root->IsDescendantOf(outer_iframe)); |
+ EXPECT_FALSE(outer_root->IsDescendantOf(inner_root)); |
+ EXPECT_FALSE(outer_root->IsDescendantOf(inner_button)); |
+ EXPECT_FALSE(outer_iframe->IsDescendantOf(inner_root)); |
+ EXPECT_FALSE(outer_iframe->IsDescendantOf(inner_button)); |
+} |
+ |
+TEST_F(FrameTreeAccessibilityTest, InnerFrameVanishing) { |
+ BrowserAccessibility* outer_root = outer_manager_->GetRoot(); |
+ BrowserAccessibility* outer_iframe = outer_root->PlatformGetChild(0); |
+ LinkFrames(); |
+ |
+ ASSERT_EQ(1U, outer_iframe->PlatformChildCount()); |
+ BrowserAccessibility* inner_root = outer_iframe->PlatformGetChild(0); |
+ ASSERT_EQ(ui::AX_ROLE_ROOT_WEB_AREA, inner_root->GetRole()); |
+ |
+ FrameTreeAccessibility* frames = FrameTreeAccessibility::GetInstance(); |
+ frames->OnFrameDeleted(&inner_frame_); |
+ inner_manager_.reset(NULL); |
+ |
+ ASSERT_EQ(0U, outer_iframe->PlatformChildCount()); |
+} |
+ |
+} // namespace content |