| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 "webkit/glue/webaccessibility.h" | 5 #include "webkit/glue/webaccessibility.h" |
| 6 | 6 |
| 7 #include "third_party/WebKit/WebKit/chromium/public/WebAccessibilityCache.h" | 7 #include "third_party/WebKit/WebKit/chromium/public/WebAccessibilityCache.h" |
| 8 #include "third_party/WebKit/WebKit/chromium/public/WebAccessibilityObject.h" | 8 #include "third_party/WebKit/WebKit/chromium/public/WebAccessibilityObject.h" |
| 9 #include "third_party/WebKit/WebKit/chromium/public/WebAccessibilityRole.h" | 9 #include "third_party/WebKit/WebKit/chromium/public/WebAccessibilityRole.h" |
| 10 #include "third_party/WebKit/WebKit/chromium/public/WebPoint.h" | 10 #include "third_party/WebKit/WebKit/chromium/public/WebPoint.h" |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 138 | 138 |
| 139 if (o.isVisited()) | 139 if (o.isVisited()) |
| 140 state |= static_cast<long>(1 << WebAccessibility::STATE_TRAVERSED); | 140 state |= static_cast<long>(1 << WebAccessibility::STATE_TRAVERSED); |
| 141 | 141 |
| 142 if (!o.isEnabled()) | 142 if (!o.isEnabled()) |
| 143 state |= static_cast<long>(1 << WebAccessibility::STATE_UNAVAILABLE); | 143 state |= static_cast<long>(1 << WebAccessibility::STATE_UNAVAILABLE); |
| 144 | 144 |
| 145 return state; | 145 return state; |
| 146 } | 146 } |
| 147 | 147 |
| 148 | 148 int32 WebAccessibility::GetAccObjInfo(WebAccessibilityCache* cache, |
| 149 bool WebAccessibility::GetAccObjInfo(WebAccessibilityCache* cache, | |
| 150 const WebAccessibility::InParams& in_params, | 149 const WebAccessibility::InParams& in_params, |
| 151 WebAccessibility::OutParams* out_params) { | 150 WebAccessibility::OutParams* out_params) { |
| 152 | |
| 153 // Find object requested by |object_id|. | 151 // Find object requested by |object_id|. |
| 154 WebAccessibilityObject active_acc_obj; | 152 WebAccessibilityObject active_acc_obj; |
| 155 | 153 |
| 156 // Since ids assigned by Chrome starts at 1000, whereas platform-specific ids | 154 // Since ids assigned by Chrome starts at 1000, whereas platform-specific ids |
| 157 // used to reference a child will be in a wholly different range, we know | 155 // used to reference a child will be in a wholly different range, we know |
| 158 // that any id that high should be treated as a non-direct descendant. | 156 // that any id that high should be treated as a non-direct descendant. |
| 159 bool local_child = false; | 157 bool local_child = false; |
| 160 if (cache->isValidId(in_params.child_id)) { | 158 if (cache->isValidId(in_params.child_id)) { |
| 161 // Object is not a direct child, re-map the input parameters accordingly. | 159 // Object is not a direct child, re-map the input parameters accordingly. |
| 162 // The object to be retrieved is referred to by the |in_params.child_id|, as | 160 // The object to be retrieved is referred to by the |in_params.child_id|, as |
| 163 // a result of e.g. a focus event. | 161 // a result of e.g. a focus event. |
| 164 active_acc_obj = cache->getObjectById(in_params.child_id); | 162 active_acc_obj = cache->getObjectById(in_params.child_id); |
| 165 } else { | 163 } else { |
| 166 local_child = true; | 164 local_child = true; |
| 167 | 165 |
| 168 active_acc_obj = cache->getObjectById(in_params.object_id); | 166 active_acc_obj = cache->getObjectById(in_params.object_id); |
| 169 if (active_acc_obj.isNull()) | 167 if (active_acc_obj.isNull()) |
| 170 return false; | 168 return RETURNCODE_FAIL; |
| 171 | 169 |
| 172 // child_id == 0 means self. Otherwise, it's a local child - 1. | 170 // child_id == 0 means self. Otherwise, it's a local child - 1. |
| 173 if (in_params.child_id > 0) { | 171 if (in_params.child_id > 0) { |
| 174 unsigned index = in_params.child_id - 1; | 172 unsigned index = in_params.child_id - 1; |
| 175 if (index >= active_acc_obj.childCount()) | 173 if (index >= active_acc_obj.childCount()) |
| 176 return false; | 174 return RETURNCODE_FAIL; |
| 177 | 175 |
| 178 active_acc_obj = active_acc_obj.childAt(index); | 176 active_acc_obj = active_acc_obj.childAt(index); |
| 179 } | 177 } |
| 180 } | 178 } |
| 181 | 179 |
| 182 if (active_acc_obj.isNull()) | 180 if (active_acc_obj.isNull()) |
| 183 return false; | 181 return RETURNCODE_FAIL; |
| 184 | 182 |
| 185 // Temp paramters for holding output information. | 183 // Temp paramters for holding output information. |
| 186 WebAccessibilityObject out_acc_obj; | 184 WebAccessibilityObject out_acc_obj; |
| 187 string16 out_string; | 185 string16 out_string; |
| 188 | 186 |
| 189 switch (in_params.function_id) { | 187 switch (in_params.function_id) { |
| 190 case WebAccessibility::FUNCTION_DODEFAULTACTION: { | 188 case WebAccessibility::FUNCTION_DODEFAULTACTION: { |
| 191 if (!active_acc_obj.performDefaultAction()) | 189 if (!active_acc_obj.performDefaultAction()) |
| 192 return false; | 190 return RETURNCODE_FALSE; |
| 193 break; | 191 break; |
| 194 } | 192 } |
| 195 case WebAccessibility::FUNCTION_HITTEST: { | 193 case WebAccessibility::FUNCTION_HITTEST: { |
| 196 WebPoint point(in_params.input_long1, in_params.input_long2); | 194 WebPoint point(in_params.input_long1, in_params.input_long2); |
| 197 out_acc_obj = active_acc_obj.hitTest(point); | 195 out_acc_obj = active_acc_obj.hitTest(point); |
| 198 if (out_acc_obj.isNull()) | 196 if (out_acc_obj.isNull()) |
| 199 return false; | 197 return RETURNCODE_FALSE; |
| 200 break; | 198 break; |
| 201 } | 199 } |
| 202 case WebAccessibility::FUNCTION_LOCATION: { | 200 case WebAccessibility::FUNCTION_LOCATION: { |
| 203 WebRect rect = active_acc_obj.boundingBoxRect(); | 201 WebRect rect = active_acc_obj.boundingBoxRect(); |
| 204 out_params->output_long1 = rect.x; | 202 out_params->output_long1 = rect.x; |
| 205 out_params->output_long2 = rect.y; | 203 out_params->output_long2 = rect.y; |
| 206 out_params->output_long3 = rect.width; | 204 out_params->output_long3 = rect.width; |
| 207 out_params->output_long4 = rect.height; | 205 out_params->output_long4 = rect.height; |
| 208 break; | 206 break; |
| 209 } | 207 } |
| 210 case WebAccessibility::FUNCTION_NAVIGATE: { | 208 case WebAccessibility::FUNCTION_NAVIGATE: { |
| 211 WebAccessibility::Direction dir = | 209 WebAccessibility::Direction dir = |
| 212 static_cast<WebAccessibility::Direction>(in_params.input_long1); | 210 static_cast<WebAccessibility::Direction>(in_params.input_long1); |
| 213 switch (dir) { | 211 switch (dir) { |
| 214 case WebAccessibility::DIRECTION_DOWN: | 212 case WebAccessibility::DIRECTION_DOWN: |
| 215 case WebAccessibility::DIRECTION_UP: | 213 case WebAccessibility::DIRECTION_UP: |
| 216 case WebAccessibility::DIRECTION_LEFT: | 214 case WebAccessibility::DIRECTION_LEFT: |
| 217 case WebAccessibility::DIRECTION_RIGHT: | 215 case WebAccessibility::DIRECTION_RIGHT: |
| 218 // These directions are not implemented, matching Mozilla and IE. | 216 // These directions are not implemented, matching Mozilla and IE. |
| 219 return false; | 217 return RETURNCODE_FALSE; |
| 220 case WebAccessibility::DIRECTION_LASTCHILD: | 218 case WebAccessibility::DIRECTION_LASTCHILD: |
| 221 case WebAccessibility::DIRECTION_FIRSTCHILD: | 219 case WebAccessibility::DIRECTION_FIRSTCHILD: |
| 222 // MSDN states that navigating to first/last child can only be from | 220 // MSDN states that navigating to first/last child can only be from |
| 223 // self. | 221 // self. |
| 224 if (!local_child) | 222 if (!local_child) |
| 225 return false; | 223 return RETURNCODE_FALSE; |
| 226 | 224 |
| 227 if (dir == WebAccessibility::DIRECTION_FIRSTCHILD) { | 225 if (dir == WebAccessibility::DIRECTION_FIRSTCHILD) { |
| 228 out_acc_obj = active_acc_obj.firstChild(); | 226 out_acc_obj = active_acc_obj.firstChild(); |
| 229 } else { | 227 } else { |
| 230 out_acc_obj = active_acc_obj.lastChild(); | 228 out_acc_obj = active_acc_obj.lastChild(); |
| 231 } | 229 } |
| 232 break; | 230 break; |
| 233 case WebAccessibility::DIRECTION_NEXT: | 231 case WebAccessibility::DIRECTION_NEXT: |
| 234 case WebAccessibility::DIRECTION_PREVIOUS: { | 232 case WebAccessibility::DIRECTION_PREVIOUS: { |
| 235 if (dir == WebAccessibility::DIRECTION_NEXT) { | 233 if (dir == WebAccessibility::DIRECTION_NEXT) { |
| 236 out_acc_obj = active_acc_obj.nextSibling(); | 234 out_acc_obj = active_acc_obj.nextSibling(); |
| 237 } else { | 235 } else { |
| 238 out_acc_obj = active_acc_obj.previousSibling(); | 236 out_acc_obj = active_acc_obj.previousSibling(); |
| 239 } | 237 } |
| 240 break; | 238 break; |
| 241 } | 239 } |
| 242 default: | 240 default: |
| 243 return false; | 241 return RETURNCODE_FALSE; |
| 244 } | 242 } |
| 243 |
| 245 if (out_acc_obj.isNull()) | 244 if (out_acc_obj.isNull()) |
| 246 return false; | 245 return RETURNCODE_FALSE; |
| 246 |
| 247 break; | 247 break; |
| 248 } | 248 } |
| 249 case WebAccessibility::FUNCTION_GETCHILD: { | 249 case WebAccessibility::FUNCTION_GETCHILD: { |
| 250 out_params->object_id = in_params.object_id; | 250 out_params->object_id = in_params.object_id; |
| 251 out_acc_obj = active_acc_obj; | 251 out_acc_obj = active_acc_obj; |
| 252 break; | 252 break; |
| 253 } | 253 } |
| 254 case WebAccessibility::FUNCTION_CHILDCOUNT: { | 254 case WebAccessibility::FUNCTION_CHILDCOUNT: { |
| 255 out_params->output_long1 = active_acc_obj.childCount(); | 255 out_params->output_long1 = active_acc_obj.childCount(); |
| 256 break; | 256 break; |
| 257 } | 257 } |
| 258 case WebAccessibility::FUNCTION_DEFAULTACTION: { | 258 case WebAccessibility::FUNCTION_DEFAULTACTION: { |
| 259 out_string = active_acc_obj.actionVerb(); | 259 out_string = active_acc_obj.actionVerb(); |
| 260 if (out_string.empty()) | 260 if (out_string.empty()) |
| 261 return false; | 261 return RETURNCODE_FALSE; |
| 262 break; | 262 break; |
| 263 } | 263 } |
| 264 case WebAccessibility::FUNCTION_DESCRIPTION: { | 264 case WebAccessibility::FUNCTION_DESCRIPTION: { |
| 265 out_string = active_acc_obj.accessibilityDescription(); | 265 out_string = active_acc_obj.accessibilityDescription(); |
| 266 if (out_string.empty()) | 266 if (out_string.empty()) |
| 267 return false; | 267 return RETURNCODE_FALSE; |
| 268 // From the Mozilla MSAA implementation: | 268 // From the Mozilla MSAA implementation: |
| 269 // "Signal to screen readers that this description is speakable and is not | 269 // "Signal to screen readers that this description is speakable and is not |
| 270 // a formatted positional information description. Don't localize the | 270 // a formatted positional information description. Don't localize the |
| 271 // 'Description: ' part of this string, it will be parsed out by assistive | 271 // 'Description: ' part of this string, it will be parsed out by assistive |
| 272 // technologies." | 272 // technologies." |
| 273 out_string = L"Description: " + out_string; | 273 out_string = L"Description: " + out_string; |
| 274 break; | 274 break; |
| 275 } | 275 } |
| 276 case WebAccessibility::FUNCTION_GETFOCUSEDCHILD: { | 276 case WebAccessibility::FUNCTION_GETFOCUSEDCHILD: { |
| 277 out_acc_obj = active_acc_obj.focusedChild(); | 277 out_acc_obj = active_acc_obj.focusedChild(); |
| 278 if (out_acc_obj.isNull()) | 278 if (out_acc_obj.isNull()) |
| 279 return false; | 279 return RETURNCODE_FALSE; |
| 280 break; | 280 break; |
| 281 } | 281 } |
| 282 case WebAccessibility::FUNCTION_HELPTEXT: { | 282 case WebAccessibility::FUNCTION_HELPTEXT: { |
| 283 out_string = active_acc_obj.helpText(); | 283 out_string = active_acc_obj.helpText(); |
| 284 if (out_string.empty()) | 284 if (out_string.empty()) |
| 285 return false; | 285 return RETURNCODE_FALSE; |
| 286 break; | 286 break; |
| 287 } | 287 } |
| 288 case WebAccessibility::FUNCTION_KEYBOARDSHORTCUT: { | 288 case WebAccessibility::FUNCTION_KEYBOARDSHORTCUT: { |
| 289 out_string = active_acc_obj.keyboardShortcut(); | 289 out_string = active_acc_obj.keyboardShortcut(); |
| 290 if (out_string.empty()) | 290 if (out_string.empty()) |
| 291 return false; | 291 return RETURNCODE_FALSE; |
| 292 break; | 292 break; |
| 293 } | 293 } |
| 294 case WebAccessibility::FUNCTION_NAME: { | 294 case WebAccessibility::FUNCTION_NAME: { |
| 295 out_string = active_acc_obj.title(); | 295 out_string = active_acc_obj.title(); |
| 296 if (out_string.empty()) | 296 if (out_string.empty()) |
| 297 return false; | 297 return RETURNCODE_FALSE; |
| 298 break; | 298 break; |
| 299 } | 299 } |
| 300 case WebAccessibility::FUNCTION_GETPARENT: { | 300 case WebAccessibility::FUNCTION_GETPARENT: { |
| 301 out_acc_obj = active_acc_obj.parentObject(); | 301 out_acc_obj = active_acc_obj.parentObject(); |
| 302 if (out_acc_obj.isNull()) | 302 if (out_acc_obj.isNull()) |
| 303 return false; | 303 return RETURNCODE_FALSE; |
| 304 break; | 304 break; |
| 305 } | 305 } |
| 306 case WebAccessibility::FUNCTION_ROLE: { | 306 case WebAccessibility::FUNCTION_ROLE: { |
| 307 out_params->output_long1 = ConvertRole(active_acc_obj.roleValue()); | 307 out_params->output_long1 = ConvertRole(active_acc_obj.roleValue()); |
| 308 break; | 308 break; |
| 309 } | 309 } |
| 310 case WebAccessibility::FUNCTION_STATE: { | 310 case WebAccessibility::FUNCTION_STATE: { |
| 311 out_params->output_long1 = ConvertState(active_acc_obj); | 311 out_params->output_long1 = ConvertState(active_acc_obj); |
| 312 break; | 312 break; |
| 313 } | 313 } |
| 314 case WebAccessibility::FUNCTION_VALUE: { | 314 case WebAccessibility::FUNCTION_VALUE: { |
| 315 out_string = active_acc_obj.stringValue(); | 315 out_string = active_acc_obj.stringValue(); |
| 316 if (out_string.empty()) | 316 if (out_string.empty()) |
| 317 return false; | 317 return RETURNCODE_FALSE; |
| 318 break; | 318 break; |
| 319 } | 319 } |
| 320 default: | 320 default: |
| 321 // Non-supported function id. | 321 // Non-supported function id. |
| 322 return false; | 322 return RETURNCODE_FAIL; |
| 323 } | 323 } |
| 324 | 324 |
| 325 // Output and hashmap assignments, as appropriate. | 325 // Output and hashmap assignments, as appropriate. |
| 326 if (!out_string.empty()) | 326 if (!out_string.empty()) |
| 327 out_params->output_string = out_string; | 327 out_params->output_string = out_string; |
| 328 | 328 |
| 329 if (out_acc_obj.isNull()) | 329 if (out_acc_obj.isNull()) |
| 330 return true; | 330 return RETURNCODE_TRUE; |
| 331 | 331 |
| 332 int id = cache->addOrGetId(out_acc_obj); | 332 int id = cache->addOrGetId(out_acc_obj); |
| 333 out_params->object_id = id; | 333 out_params->object_id = id; |
| 334 out_params->output_long1 = -1; | 334 out_params->output_long1 = -1; |
| 335 | 335 |
| 336 // TODO(klink): Handle simple objects returned. | 336 // TODO(ctguil): Handle simple objects returned. |
| 337 return true; | 337 return RETURNCODE_TRUE; |
| 338 } | 338 } |
| 339 | 339 |
| 340 } // namespace webkit_glue | 340 } // namespace webkit_glue |
| OLD | NEW |