| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/utf_string_conversions.h" | 5 #include "base/utf_string_conversions.h" |
| 6 #include "content/common/accessibility_messages.h" | 6 #include "content/common/accessibility_messages.h" |
| 7 #include "content/common/accessibility_node_data.h" |
| 7 #include "content/common/view_messages.h" | 8 #include "content/common/view_messages.h" |
| 8 #include "content/renderer/render_view_impl.h" | 9 #include "content/renderer/render_view_impl.h" |
| 9 #include "content/public/test/render_view_test.h" | 10 #include "content/public/test/render_view_test.h" |
| 10 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
| 11 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebSize.h" | 12 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebSize.h" |
| 12 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" | 13 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" |
| 13 #include "webkit/glue/webaccessibility.h" | |
| 14 | 14 |
| 15 using webkit_glue::WebAccessibility; | 15 using content::AccessibilityNodeData; |
| 16 | 16 |
| 17 class RendererAccessibilityTest : public content::RenderViewTest { | 17 class RendererAccessibilityTest : public content::RenderViewTest { |
| 18 public: | 18 public: |
| 19 RendererAccessibilityTest() {} | 19 RendererAccessibilityTest() {} |
| 20 | 20 |
| 21 RenderViewImpl* view() { | 21 RenderViewImpl* view() { |
| 22 return static_cast<RenderViewImpl*>(view_); | 22 return static_cast<RenderViewImpl*>(view_); |
| 23 } | 23 } |
| 24 | 24 |
| 25 virtual void SetUp() { | 25 virtual void SetUp() { |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 72 // on the document. | 72 // on the document. |
| 73 { | 73 { |
| 74 SCOPED_TRACE("Initial focus on document"); | 74 SCOPED_TRACE("Initial focus on document"); |
| 75 AccessibilityHostMsg_NotificationParams notification; | 75 AccessibilityHostMsg_NotificationParams notification; |
| 76 GetLastAccNotification(¬ification); | 76 GetLastAccNotification(¬ification); |
| 77 EXPECT_EQ(notification.notification_type, | 77 EXPECT_EQ(notification.notification_type, |
| 78 AccessibilityNotificationLayoutComplete); | 78 AccessibilityNotificationLayoutComplete); |
| 79 EXPECT_EQ(notification.includes_children, true); | 79 EXPECT_EQ(notification.includes_children, true); |
| 80 EXPECT_EQ(notification.id, 1); | 80 EXPECT_EQ(notification.id, 1); |
| 81 EXPECT_EQ(notification.acc_tree.id, 1); | 81 EXPECT_EQ(notification.acc_tree.id, 1); |
| 82 EXPECT_EQ(notification.acc_tree.role, WebAccessibility::ROLE_ROOT_WEB_AREA); | 82 EXPECT_EQ(notification.acc_tree.role, |
| 83 AccessibilityNodeData::ROLE_ROOT_WEB_AREA); |
| 83 EXPECT_EQ(notification.acc_tree.state, | 84 EXPECT_EQ(notification.acc_tree.state, |
| 84 (1U << WebAccessibility::STATE_READONLY) | | 85 (1U << AccessibilityNodeData::STATE_READONLY) | |
| 85 (1U << WebAccessibility::STATE_FOCUSABLE) | | 86 (1U << AccessibilityNodeData::STATE_FOCUSABLE) | |
| 86 (1U << WebAccessibility::STATE_FOCUSED)); | 87 (1U << AccessibilityNodeData::STATE_FOCUSED)); |
| 87 EXPECT_EQ(notification.acc_tree.children.size(), 1U); | 88 EXPECT_EQ(notification.acc_tree.children.size(), 1U); |
| 88 } | 89 } |
| 89 | 90 |
| 90 // Now focus the input element, and check everything again. | 91 // Now focus the input element, and check everything again. |
| 91 { | 92 { |
| 92 SCOPED_TRACE("input"); | 93 SCOPED_TRACE("input"); |
| 93 sink_->ClearMessages(); | 94 sink_->ClearMessages(); |
| 94 ExecuteJavaScript("document.querySelector('input').focus();"); | 95 ExecuteJavaScript("document.querySelector('input').focus();"); |
| 95 AccessibilityHostMsg_NotificationParams notification; | 96 AccessibilityHostMsg_NotificationParams notification; |
| 96 GetLastAccNotification(¬ification); | 97 GetLastAccNotification(¬ification); |
| 97 EXPECT_EQ(notification.notification_type, | 98 EXPECT_EQ(notification.notification_type, |
| 98 AccessibilityNotificationFocusChanged); | 99 AccessibilityNotificationFocusChanged); |
| 99 EXPECT_EQ(notification.includes_children, true); | 100 EXPECT_EQ(notification.includes_children, true); |
| 100 EXPECT_EQ(notification.id, 3); | 101 EXPECT_EQ(notification.id, 3); |
| 101 EXPECT_EQ(notification.acc_tree.id, 1); | 102 EXPECT_EQ(notification.acc_tree.id, 1); |
| 102 EXPECT_EQ(notification.acc_tree.role, WebAccessibility::ROLE_ROOT_WEB_AREA); | 103 EXPECT_EQ(notification.acc_tree.role, |
| 104 AccessibilityNodeData::ROLE_ROOT_WEB_AREA); |
| 103 EXPECT_EQ(notification.acc_tree.state, | 105 EXPECT_EQ(notification.acc_tree.state, |
| 104 (1U << WebAccessibility::STATE_READONLY) | | 106 (1U << AccessibilityNodeData::STATE_READONLY) | |
| 105 (1U << WebAccessibility::STATE_FOCUSABLE)); | 107 (1U << AccessibilityNodeData::STATE_FOCUSABLE)); |
| 106 EXPECT_EQ(notification.acc_tree.children.size(), 1U); | 108 EXPECT_EQ(notification.acc_tree.children.size(), 1U); |
| 107 EXPECT_EQ(notification.acc_tree.children[0].id, 3); | 109 EXPECT_EQ(notification.acc_tree.children[0].id, 3); |
| 108 EXPECT_EQ(notification.acc_tree.children[0].role, | 110 EXPECT_EQ(notification.acc_tree.children[0].role, |
| 109 WebAccessibility::ROLE_GROUP); | 111 AccessibilityNodeData::ROLE_GROUP); |
| 110 EXPECT_EQ(notification.acc_tree.children[0].state, | 112 EXPECT_EQ(notification.acc_tree.children[0].state, |
| 111 (1U << WebAccessibility::STATE_FOCUSABLE) | | 113 (1U << AccessibilityNodeData::STATE_FOCUSABLE) | |
| 112 (1U << WebAccessibility::STATE_FOCUSED)); | 114 (1U << AccessibilityNodeData::STATE_FOCUSED)); |
| 113 } | 115 } |
| 114 | 116 |
| 115 // Check other editable text nodes. | 117 // Check other editable text nodes. |
| 116 { | 118 { |
| 117 SCOPED_TRACE("textarea"); | 119 SCOPED_TRACE("textarea"); |
| 118 sink_->ClearMessages(); | 120 sink_->ClearMessages(); |
| 119 ExecuteJavaScript("document.querySelector('textarea').focus();"); | 121 ExecuteJavaScript("document.querySelector('textarea').focus();"); |
| 120 AccessibilityHostMsg_NotificationParams notification; | 122 AccessibilityHostMsg_NotificationParams notification; |
| 121 GetLastAccNotification(¬ification); | 123 GetLastAccNotification(¬ification); |
| 122 EXPECT_EQ(notification.id, 4); | 124 EXPECT_EQ(notification.id, 4); |
| 123 EXPECT_EQ(notification.acc_tree.children[0].state, | 125 EXPECT_EQ(notification.acc_tree.children[0].state, |
| 124 (1U << WebAccessibility::STATE_FOCUSABLE) | | 126 (1U << AccessibilityNodeData::STATE_FOCUSABLE) | |
| 125 (1U << WebAccessibility::STATE_FOCUSED)); | 127 (1U << AccessibilityNodeData::STATE_FOCUSED)); |
| 126 } | 128 } |
| 127 | 129 |
| 128 { | 130 { |
| 129 SCOPED_TRACE("contentEditable"); | 131 SCOPED_TRACE("contentEditable"); |
| 130 sink_->ClearMessages(); | 132 sink_->ClearMessages(); |
| 131 ExecuteJavaScript("document.querySelector('p').focus();"); | 133 ExecuteJavaScript("document.querySelector('p').focus();"); |
| 132 AccessibilityHostMsg_NotificationParams notification; | 134 AccessibilityHostMsg_NotificationParams notification; |
| 133 GetLastAccNotification(¬ification); | 135 GetLastAccNotification(¬ification); |
| 134 EXPECT_EQ(notification.id, 5); | 136 EXPECT_EQ(notification.id, 5); |
| 135 EXPECT_EQ(notification.acc_tree.children[0].state, | 137 EXPECT_EQ(notification.acc_tree.children[0].state, |
| 136 (1U << WebAccessibility::STATE_FOCUSABLE) | | 138 (1U << AccessibilityNodeData::STATE_FOCUSABLE) | |
| 137 (1U << WebAccessibility::STATE_FOCUSED)); | 139 (1U << AccessibilityNodeData::STATE_FOCUSED)); |
| 138 } | 140 } |
| 139 | 141 |
| 140 { | 142 { |
| 141 SCOPED_TRACE("role=textarea"); | 143 SCOPED_TRACE("role=textarea"); |
| 142 sink_->ClearMessages(); | 144 sink_->ClearMessages(); |
| 143 ExecuteJavaScript("document.querySelector('div').focus();"); | 145 ExecuteJavaScript("document.querySelector('div').focus();"); |
| 144 AccessibilityHostMsg_NotificationParams notification; | 146 AccessibilityHostMsg_NotificationParams notification; |
| 145 GetLastAccNotification(¬ification); | 147 GetLastAccNotification(¬ification); |
| 146 EXPECT_EQ(notification.id, 6); | 148 EXPECT_EQ(notification.id, 6); |
| 147 EXPECT_EQ(notification.acc_tree.children[0].state, | 149 EXPECT_EQ(notification.acc_tree.children[0].state, |
| 148 (1U << WebAccessibility::STATE_FOCUSABLE) | | 150 (1U << AccessibilityNodeData::STATE_FOCUSABLE) | |
| 149 (1U << WebAccessibility::STATE_FOCUSED)); | 151 (1U << AccessibilityNodeData::STATE_FOCUSED)); |
| 150 } | 152 } |
| 151 | 153 |
| 152 // Try focusing things that aren't editable text. | 154 // Try focusing things that aren't editable text. |
| 153 { | 155 { |
| 154 SCOPED_TRACE("button"); | 156 SCOPED_TRACE("button"); |
| 155 sink_->ClearMessages(); | 157 sink_->ClearMessages(); |
| 156 ExecuteJavaScript("document.querySelector('button').focus();"); | 158 ExecuteJavaScript("document.querySelector('button').focus();"); |
| 157 AccessibilityHostMsg_NotificationParams notification; | 159 AccessibilityHostMsg_NotificationParams notification; |
| 158 GetLastAccNotification(¬ification); | 160 GetLastAccNotification(¬ification); |
| 159 EXPECT_EQ(notification.id, 7); | 161 EXPECT_EQ(notification.id, 7); |
| 160 EXPECT_EQ(notification.acc_tree.children[0].state, | 162 EXPECT_EQ(notification.acc_tree.children[0].state, |
| 161 (1U << WebAccessibility::STATE_FOCUSABLE) | | 163 (1U << AccessibilityNodeData::STATE_FOCUSABLE) | |
| 162 (1U << WebAccessibility::STATE_FOCUSED) | | 164 (1U << AccessibilityNodeData::STATE_FOCUSED) | |
| 163 (1U << WebAccessibility::STATE_READONLY)); | 165 (1U << AccessibilityNodeData::STATE_READONLY)); |
| 164 } | 166 } |
| 165 | 167 |
| 166 { | 168 { |
| 167 SCOPED_TRACE("link"); | 169 SCOPED_TRACE("link"); |
| 168 sink_->ClearMessages(); | 170 sink_->ClearMessages(); |
| 169 ExecuteJavaScript("document.querySelector('a').focus();"); | 171 ExecuteJavaScript("document.querySelector('a').focus();"); |
| 170 AccessibilityHostMsg_NotificationParams notification; | 172 AccessibilityHostMsg_NotificationParams notification; |
| 171 GetLastAccNotification(¬ification); | 173 GetLastAccNotification(¬ification); |
| 172 EXPECT_EQ(notification.id, 8); | 174 EXPECT_EQ(notification.id, 8); |
| 173 EXPECT_EQ(notification.acc_tree.children[0].state, | 175 EXPECT_EQ(notification.acc_tree.children[0].state, |
| 174 (1U << WebAccessibility::STATE_FOCUSABLE) | | 176 (1U << AccessibilityNodeData::STATE_FOCUSABLE) | |
| 175 (1U << WebAccessibility::STATE_FOCUSED) | | 177 (1U << AccessibilityNodeData::STATE_FOCUSED) | |
| 176 (1U << WebAccessibility::STATE_READONLY)); | 178 (1U << AccessibilityNodeData::STATE_READONLY)); |
| 177 } | 179 } |
| 178 | 180 |
| 179 // Clear focus. | 181 // Clear focus. |
| 180 { | 182 { |
| 181 SCOPED_TRACE("Back to document."); | 183 SCOPED_TRACE("Back to document."); |
| 182 sink_->ClearMessages(); | 184 sink_->ClearMessages(); |
| 183 ExecuteJavaScript("document.activeElement.blur()"); | 185 ExecuteJavaScript("document.activeElement.blur()"); |
| 184 AccessibilityHostMsg_NotificationParams notification; | 186 AccessibilityHostMsg_NotificationParams notification; |
| 185 GetLastAccNotification(¬ification); | 187 GetLastAccNotification(¬ification); |
| 186 EXPECT_EQ(notification.id, 1); | 188 EXPECT_EQ(notification.id, 1); |
| 187 } | 189 } |
| 188 } | 190 } |
| OLD | NEW |