Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(253)

Side by Side Diff: content/browser/accessibility/accessibility_action_browsertest.cc

Issue 2522543004: Add support for retrieving image thumbnails as part of the accessibility tree. (Closed)
Patch Set: Clarified maxSize Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698