| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/logging.h" | 5 #include "base/logging.h" |
| 6 #include "content/browser/accessibility/browser_accessibility.h" | 6 #include "content/browser/accessibility/browser_accessibility.h" |
| 7 #include "content/browser/accessibility/browser_accessibility_manager.h" | 7 #include "content/browser/accessibility/browser_accessibility_manager.h" |
| 8 #include "content/browser/web_contents/web_contents_impl.h" | 8 #include "content/browser/web_contents/web_contents_impl.h" |
| 9 #include "content/public/test/browser_test_utils.h" | 9 #include "content/public/test/browser_test_utils.h" |
| 10 #include "content/public/test/content_browser_test.h" | 10 #include "content/public/test/content_browser_test.h" |
| 11 #include "content/public/test/content_browser_test_utils.h" | 11 #include "content/public/test/content_browser_test_utils.h" |
| 12 #include "content/public/test/test_utils.h" | 12 #include "content/public/test/test_utils.h" |
| 13 #include "content/shell/browser/shell.h" | 13 #include "content/shell/browser/shell.h" |
| 14 #include "content/test/accessibility_browser_test_utils.h" | 14 #include "content/test/accessibility_browser_test_utils.h" |
| 15 #include "net/base/data_url.h" |
| 15 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 17 #include "ui/gfx/codec/png_codec.h" |
| 18 #include "url/gurl.h" |
| 16 | 19 |
| 17 namespace content { | 20 namespace content { |
| 18 | 21 |
| 19 namespace { | 22 namespace { |
| 20 | 23 |
| 21 class AccessibilityActionBrowserTest : public ContentBrowserTest { | 24 class AccessibilityActionBrowserTest : public ContentBrowserTest { |
| 22 public: | 25 public: |
| 23 AccessibilityActionBrowserTest() {} | 26 AccessibilityActionBrowserTest() {} |
| 24 ~AccessibilityActionBrowserTest() override {} | 27 ~AccessibilityActionBrowserTest() override {} |
| 25 | 28 |
| 26 protected: | 29 protected: |
| 27 BrowserAccessibility* FindNode(ui::AXRole role, | 30 BrowserAccessibility* FindNode(ui::AXRole role, |
| 28 const std::string& name) { | 31 const std::string& name) { |
| 29 BrowserAccessibility* root = GetManager()->GetRoot(); | 32 BrowserAccessibility* root = GetManager()->GetRoot(); |
| 30 CHECK(root); | 33 CHECK(root); |
| 31 return FindNodeInSubtree(*root, role, name); | 34 return FindNodeInSubtree(*root, role, name); |
| 32 } | 35 } |
| 33 | 36 |
| 34 BrowserAccessibilityManager* GetManager() { | 37 BrowserAccessibilityManager* GetManager() { |
| 35 WebContentsImpl* web_contents = | 38 WebContentsImpl* web_contents = |
| 36 static_cast<WebContentsImpl*>(shell()->web_contents()); | 39 static_cast<WebContentsImpl*>(shell()->web_contents()); |
| 37 return web_contents->GetRootBrowserAccessibilityManager(); | 40 return web_contents->GetRootBrowserAccessibilityManager(); |
| 38 } | 41 } |
| 39 | 42 |
| 43 void GetBitmapFromImageDataURL(BrowserAccessibility* target, |
| 44 SkBitmap* bitmap) { |
| 45 std::string image_data_url = target->GetStringAttribute( |
| 46 ui::AX_ATTR_IMAGE_DATA_URL); |
| 47 std::string mimetype; |
| 48 std::string charset; |
| 49 std::string png_data; |
| 50 ASSERT_TRUE(net::DataURL::Parse(GURL(image_data_url), |
| 51 &mimetype, &charset, &png_data)); |
| 52 ASSERT_EQ("image/png", mimetype); |
| 53 ASSERT_TRUE(gfx::PNGCodec::Decode( |
| 54 reinterpret_cast<const unsigned char*>(png_data.data()), |
| 55 png_data.size(), bitmap)); |
| 56 } |
| 57 |
| 40 private: | 58 private: |
| 41 BrowserAccessibility* FindNodeInSubtree( | 59 BrowserAccessibility* FindNodeInSubtree( |
| 42 BrowserAccessibility& node, | 60 BrowserAccessibility& node, |
| 43 ui::AXRole role, | 61 ui::AXRole role, |
| 44 const std::string& name) { | 62 const std::string& name) { |
| 45 if (node.GetRole() == role && | 63 if (node.GetRole() == role && |
| 46 node.GetStringAttribute(ui::AX_ATTR_NAME) == name) | 64 node.GetStringAttribute(ui::AX_ATTR_NAME) == name) |
| 47 return &node; | 65 return &node; |
| 48 for (unsigned int i = 0; i < node.PlatformChildCount(); ++i) { | 66 for (unsigned int i = 0; i < node.PlatformChildCount(); ++i) { |
| 49 BrowserAccessibility* result = FindNodeInSubtree( | 67 BrowserAccessibility* result = FindNodeInSubtree( |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 { | 141 { |
| 124 AccessibilityNotificationWaiter waiter2(shell()->web_contents(), | 142 AccessibilityNotificationWaiter waiter2(shell()->web_contents(), |
| 125 AccessibilityModeComplete, | 143 AccessibilityModeComplete, |
| 126 ui::AX_EVENT_VALUE_CHANGED); | 144 ui::AX_EVENT_VALUE_CHANGED); |
| 127 GetManager()->Decrement(*target); | 145 GetManager()->Decrement(*target); |
| 128 waiter2.WaitForNotification(); | 146 waiter2.WaitForNotification(); |
| 129 } | 147 } |
| 130 EXPECT_EQ(8.0, target->GetFloatAttribute(ui::AX_ATTR_VALUE_FOR_RANGE)); | 148 EXPECT_EQ(8.0, target->GetFloatAttribute(ui::AX_ATTR_VALUE_FOR_RANGE)); |
| 131 } | 149 } |
| 132 | 150 |
| 151 IN_PROC_BROWSER_TEST_F(AccessibilityActionBrowserTest, CanvasGetImage) { |
| 152 NavigateToURL(shell(), GURL(url::kAboutBlankURL)); |
| 153 |
| 154 AccessibilityNotificationWaiter waiter(shell()->web_contents(), |
| 155 AccessibilityModeComplete, |
| 156 ui::AX_EVENT_LOAD_COMPLETE); |
| 157 GURL url("data:text/html," |
| 158 "<body>" |
| 159 "<canvas aria-label='canvas' id='c' width='4' height='2'></canvas>" |
| 160 "<script>\n" |
| 161 " var c = document.getElementById('c').getContext('2d');\n" |
| 162 " c.beginPath();\n" |
| 163 " c.moveTo(0, 0.5);\n" |
| 164 " c.lineTo(4, 0.5);\n" |
| 165 " c.strokeStyle = '#ff0000';\n" |
| 166 " c.stroke();\n" |
| 167 " c.beginPath();\n" |
| 168 " c.moveTo(0, 1.5);\n" |
| 169 " c.lineTo(4, 1.5);\n" |
| 170 " c.strokeStyle = '#0000ff';\n" |
| 171 " c.stroke();\n" |
| 172 "</script>" |
| 173 "</body>"); |
| 174 |
| 175 NavigateToURL(shell(), url); |
| 176 waiter.WaitForNotification(); |
| 177 |
| 178 BrowserAccessibility* target = FindNode(ui::AX_ROLE_CANVAS, "canvas"); |
| 179 ASSERT_NE(nullptr, target); |
| 180 |
| 181 AccessibilityNotificationWaiter waiter2(shell()->web_contents(), |
| 182 AccessibilityModeComplete, |
| 183 ui::AX_EVENT_IMAGE_FRAME_UPDATED); |
| 184 GetManager()->GetImageData(*target, gfx::Size()); |
| 185 waiter2.WaitForNotification(); |
| 186 |
| 187 SkBitmap bitmap; |
| 188 GetBitmapFromImageDataURL(target, &bitmap); |
| 189 ASSERT_EQ(4, bitmap.width()); |
| 190 ASSERT_EQ(2, bitmap.height()); |
| 191 EXPECT_EQ(SK_ColorRED, bitmap.getColor(0, 0)); |
| 192 EXPECT_EQ(SK_ColorRED, bitmap.getColor(1, 0)); |
| 193 EXPECT_EQ(SK_ColorRED, bitmap.getColor(2, 0)); |
| 194 EXPECT_EQ(SK_ColorRED, bitmap.getColor(3, 0)); |
| 195 EXPECT_EQ(SK_ColorBLUE, bitmap.getColor(0, 1)); |
| 196 EXPECT_EQ(SK_ColorBLUE, bitmap.getColor(1, 1)); |
| 197 EXPECT_EQ(SK_ColorBLUE, bitmap.getColor(2, 1)); |
| 198 EXPECT_EQ(SK_ColorBLUE, bitmap.getColor(3, 1)); |
| 199 } |
| 200 |
| 201 IN_PROC_BROWSER_TEST_F(AccessibilityActionBrowserTest, CanvasGetImageScale) { |
| 202 NavigateToURL(shell(), GURL(url::kAboutBlankURL)); |
| 203 |
| 204 AccessibilityNotificationWaiter waiter(shell()->web_contents(), |
| 205 AccessibilityModeComplete, |
| 206 ui::AX_EVENT_LOAD_COMPLETE); |
| 207 GURL url("data:text/html," |
| 208 "<body>" |
| 209 "<canvas aria-label='canvas' id='c' width='40' height='20'></canvas>" |
| 210 "<script>\n" |
| 211 " var c = document.getElementById('c').getContext('2d');\n" |
| 212 " c.fillStyle = '#00ff00';\n" |
| 213 " c.fillRect(0, 0, 40, 10);\n" |
| 214 " c.fillStyle = '#ff00ff';\n" |
| 215 " c.fillRect(0, 10, 40, 10);\n" |
| 216 "</script>" |
| 217 "</body>"); |
| 218 |
| 219 NavigateToURL(shell(), url); |
| 220 waiter.WaitForNotification(); |
| 221 |
| 222 BrowserAccessibility* target = FindNode(ui::AX_ROLE_CANVAS, "canvas"); |
| 223 ASSERT_NE(nullptr, target); |
| 224 |
| 225 AccessibilityNotificationWaiter waiter2(shell()->web_contents(), |
| 226 AccessibilityModeComplete, |
| 227 ui::AX_EVENT_IMAGE_FRAME_UPDATED); |
| 228 GetManager()->GetImageData(*target, gfx::Size(4, 4)); |
| 229 waiter2.WaitForNotification(); |
| 230 |
| 231 SkBitmap bitmap; |
| 232 GetBitmapFromImageDataURL(target, &bitmap); |
| 233 ASSERT_EQ(4, bitmap.width()); |
| 234 ASSERT_EQ(2, bitmap.height()); |
| 235 EXPECT_EQ(SK_ColorGREEN, bitmap.getColor(0, 0)); |
| 236 EXPECT_EQ(SK_ColorGREEN, bitmap.getColor(1, 0)); |
| 237 EXPECT_EQ(SK_ColorGREEN, bitmap.getColor(2, 0)); |
| 238 EXPECT_EQ(SK_ColorGREEN, bitmap.getColor(3, 0)); |
| 239 EXPECT_EQ(SK_ColorMAGENTA, bitmap.getColor(0, 1)); |
| 240 EXPECT_EQ(SK_ColorMAGENTA, bitmap.getColor(1, 1)); |
| 241 EXPECT_EQ(SK_ColorMAGENTA, bitmap.getColor(2, 1)); |
| 242 EXPECT_EQ(SK_ColorMAGENTA, bitmap.getColor(3, 1)); |
| 243 } |
| 244 |
| 245 IN_PROC_BROWSER_TEST_F(AccessibilityActionBrowserTest, ImgElementGetImage) { |
| 246 NavigateToURL(shell(), GURL(url::kAboutBlankURL)); |
| 247 |
| 248 AccessibilityNotificationWaiter waiter(shell()->web_contents(), |
| 249 AccessibilityModeComplete, |
| 250 ui::AX_EVENT_LOAD_COMPLETE); |
| 251 GURL url("data:text/html," |
| 252 "<body>" |
| 253 "<img src='data:image/gif;base64,R0lGODdhAgADAKEDAAAA//" |
| 254 "8AAAD/AP///ywAAAAAAgADAAACBEwkAAUAOw=='>" |
| 255 "</body>"); |
| 256 |
| 257 NavigateToURL(shell(), url); |
| 258 waiter.WaitForNotification(); |
| 259 |
| 260 BrowserAccessibility* target = FindNode(ui::AX_ROLE_IMAGE, ""); |
| 261 ASSERT_NE(nullptr, target); |
| 262 |
| 263 AccessibilityNotificationWaiter waiter2(shell()->web_contents(), |
| 264 AccessibilityModeComplete, |
| 265 ui::AX_EVENT_IMAGE_FRAME_UPDATED); |
| 266 GetManager()->GetImageData(*target, gfx::Size()); |
| 267 waiter2.WaitForNotification(); |
| 268 |
| 269 SkBitmap bitmap; |
| 270 GetBitmapFromImageDataURL(target, &bitmap); |
| 271 ASSERT_EQ(2, bitmap.width()); |
| 272 ASSERT_EQ(3, bitmap.height()); |
| 273 EXPECT_EQ(SK_ColorRED, bitmap.getColor(0, 0)); |
| 274 EXPECT_EQ(SK_ColorRED, bitmap.getColor(1, 0)); |
| 275 EXPECT_EQ(SK_ColorGREEN, bitmap.getColor(0, 1)); |
| 276 EXPECT_EQ(SK_ColorGREEN, bitmap.getColor(1, 1)); |
| 277 EXPECT_EQ(SK_ColorBLUE, bitmap.getColor(0, 2)); |
| 278 EXPECT_EQ(SK_ColorBLUE, bitmap.getColor(1, 2)); |
| 279 } |
| 280 |
| 133 } // namespace content | 281 } // namespace content |
| OLD | NEW |