OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2008 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
257 { | 257 { |
258 if (!m_renderer) | 258 if (!m_renderer) |
259 return UnknownRole; | 259 return UnknownRole; |
260 | 260 |
261 if ((m_ariaRole = determineAriaRoleAttribute()) != UnknownRole) | 261 if ((m_ariaRole = determineAriaRoleAttribute()) != UnknownRole) |
262 return m_ariaRole; | 262 return m_ariaRole; |
263 | 263 |
264 Node* node = m_renderer->node(); | 264 Node* node = m_renderer->node(); |
265 RenderBoxModelObject* cssBox = renderBoxModelObject(); | 265 RenderBoxModelObject* cssBox = renderBoxModelObject(); |
266 | 266 |
267 if (node && node->isLink()) { | |
268 if (cssBox && cssBox->isImage()) | |
269 return ImageMapRole; | |
270 return LinkRole; | |
271 } | |
272 if ((cssBox && cssBox->isListItem()) || isHTMLLIElement(node)) | 267 if ((cssBox && cssBox->isListItem()) || isHTMLLIElement(node)) |
273 return ListItemRole; | 268 return ListItemRole; |
274 if (m_renderer->isListMarker()) | 269 if (m_renderer->isListMarker()) |
275 return ListMarkerRole; | 270 return ListMarkerRole; |
276 if (isHTMLButtonElement(node)) | |
277 return buttonRoleType(); | |
278 if (isHTMLDetailsElement(node)) | |
279 return DetailsRole; | |
280 if (isHTMLSummaryElement(node)) { | |
281 if (node->parentElement() && isHTMLDetailsElement(node->parentElement())
) | |
282 return DisclosureTriangleRole; | |
283 return UnknownRole; | |
284 } | |
285 if (isHTMLLegendElement(node)) | 271 if (isHTMLLegendElement(node)) |
286 return LegendRole; | 272 return LegendRole; |
287 if (m_renderer->isText()) | 273 if (m_renderer->isText()) |
288 return StaticTextRole; | 274 return StaticTextRole; |
289 if (cssBox && cssBox->isImage()) { | 275 if (cssBox && cssBox->isImage()) { |
| 276 if (node && node->isLink()) |
| 277 return ImageMapRole; |
290 if (isHTMLInputElement(node)) | 278 if (isHTMLInputElement(node)) |
291 return ariaHasPopup() ? PopUpButtonRole : ButtonRole; | 279 return ariaHasPopup() ? PopUpButtonRole : ButtonRole; |
292 if (isSVGImage()) | 280 if (isSVGImage()) |
293 return SVGRootRole; | 281 return SVGRootRole; |
294 return ImageRole; | 282 return ImageRole; |
295 } | 283 } |
296 | |
297 // Note: if JavaScript is disabled, the renderer won't be a RenderHTMLCanvas
. | 284 // Note: if JavaScript is disabled, the renderer won't be a RenderHTMLCanvas
. |
298 if (isHTMLCanvasElement(node) && m_renderer->isCanvas()) | 285 if (isHTMLCanvasElement(node) && m_renderer->isCanvas()) |
299 return CanvasRole; | 286 return CanvasRole; |
300 | 287 |
301 if (cssBox && cssBox->isRenderView()) | 288 if (cssBox && cssBox->isRenderView()) |
302 return WebAreaRole; | 289 return WebAreaRole; |
303 | 290 |
304 if (cssBox && cssBox->isTextArea()) | |
305 return TextAreaRole; | |
306 | |
307 if (isHTMLInputElement(node)) { | |
308 HTMLInputElement& input = toHTMLInputElement(*node); | |
309 const AtomicString& type = input.type(); | |
310 if (type == InputTypeNames::button) { | |
311 if ((node->parentNode() && isHTMLMenuElement(node->parentNode())) ||
(parentObject() && parentObject()->roleValue() == MenuRole)) | |
312 return MenuItemRole; | |
313 return buttonRoleType(); | |
314 } | |
315 if (type == InputTypeNames::checkbox) { | |
316 if ((node->parentNode() && isHTMLMenuElement(node->parentNode())) ||
(parentObject() && parentObject()->roleValue() == MenuRole)) | |
317 return MenuItemCheckBoxRole; | |
318 return CheckBoxRole; | |
319 } | |
320 if (type == InputTypeNames::date) | |
321 return DateRole; | |
322 if (type == InputTypeNames::datetime | |
323 || type == InputTypeNames::datetime_local | |
324 || type == InputTypeNames::month | |
325 || type == InputTypeNames::week) | |
326 return DateTimeRole; | |
327 if (type == InputTypeNames::radio) { | |
328 if ((node->parentNode() && isHTMLMenuElement(node->parentNode())) ||
(parentObject() && parentObject()->roleValue() == MenuRole)) | |
329 return MenuItemRadioRole; | |
330 return RadioButtonRole; | |
331 } | |
332 if (type == InputTypeNames::file) | |
333 return ButtonRole; | |
334 if (type == InputTypeNames::number) | |
335 return SpinButtonRole; | |
336 if (input.isTextButton()) | |
337 return buttonRoleType(); | |
338 if (type == InputTypeNames::color) | |
339 return ColorWellRole; | |
340 if (type == InputTypeNames::time) | |
341 return TimeRole; | |
342 return TextFieldRole; | |
343 } | |
344 | |
345 if (cssBox && cssBox->isMenuList()) | |
346 return PopUpButtonRole; | |
347 | |
348 if (headingLevel()) | |
349 return HeadingRole; | |
350 | |
351 if (m_renderer->isSVGImage()) | 291 if (m_renderer->isSVGImage()) |
352 return ImageRole; | 292 return ImageRole; |
353 if (m_renderer->isSVGRoot()) | 293 if (m_renderer->isSVGRoot()) |
354 return SVGRootRole; | 294 return SVGRootRole; |
355 | 295 |
356 if (node && node->hasTagName(ddTag)) | 296 if (node && node->hasTagName(ddTag)) |
357 return DescriptionListDetailRole; | 297 return DescriptionListDetailRole; |
358 | 298 |
359 if (node && node->hasTagName(dlTag)) | |
360 return DescriptionListRole; | |
361 | |
362 if (node && node->hasTagName(dtTag)) | 299 if (node && node->hasTagName(dtTag)) |
363 return DescriptionListTermRole; | 300 return DescriptionListTermRole; |
364 | 301 |
365 if (node && (node->nodeName() == "math")) | 302 if (node && (node->nodeName() == "math")) |
366 return MathRole; | 303 return MathRole; |
367 | 304 |
368 if (node && (node->hasTagName(rpTag) || node->hasTagName(rtTag))) | 305 if (node && (node->hasTagName(rpTag) || node->hasTagName(rtTag))) |
369 return AnnotationRole; | 306 return AnnotationRole; |
370 | 307 |
371 // Table sections should be ignored. | 308 // Table sections should be ignored. |
372 if (m_renderer->isTableSection()) | 309 if (m_renderer->isTableSection()) |
373 return IgnoredRole; | 310 return IgnoredRole; |
374 | 311 |
375 if (m_renderer->isHR()) | 312 if (m_renderer->isHR()) |
376 return SplitterRole; | 313 return SplitterRole; |
377 | 314 |
378 if (isHTMLOutputElement(node)) | |
379 return StatusRole; | |
380 | |
381 if (isHTMLParagraphElement(node)) | |
382 return ParagraphRole; | |
383 | |
384 if (isHTMLLabelElement(node)) | |
385 return LabelRole; | |
386 | |
387 if (isHTMLRubyElement(node)) | |
388 return RubyRole; | |
389 | |
390 if (isHTMLDivElement(node)) | |
391 return DivRole; | |
392 | |
393 if (isHTMLMeterElement(node)) | |
394 return MeterRole; | |
395 | |
396 if (isHTMLFormElement(node)) | 315 if (isHTMLFormElement(node)) |
397 return FormRole; | 316 return FormRole; |
398 | 317 |
399 if (node && node->hasTagName(articleTag)) | 318 if (node && node->hasTagName(articleTag)) |
400 return ArticleRole; | 319 return ArticleRole; |
401 | 320 |
402 if (node && node->hasTagName(blockquoteTag)) | |
403 return BlockquoteRole; | |
404 | |
405 if (node && node->hasTagName(mainTag)) | 321 if (node && node->hasTagName(mainTag)) |
406 return MainRole; | 322 return MainRole; |
407 | 323 |
408 if (node && node->hasTagName(navTag)) | 324 if (node && node->hasTagName(navTag)) |
409 return NavigationRole; | 325 return NavigationRole; |
410 | 326 |
411 if (node && node->hasTagName(asideTag)) | 327 if (node && node->hasTagName(asideTag)) |
412 return ComplementaryRole; | 328 return ComplementaryRole; |
413 | 329 |
414 if (node && node->hasTagName(preTag)) | 330 if (node && node->hasTagName(preTag)) |
(...skipping 12 matching lines...) Expand all Loading... |
427 if (isHTMLHtmlElement(node)) | 343 if (isHTMLHtmlElement(node)) |
428 return IgnoredRole; | 344 return IgnoredRole; |
429 | 345 |
430 if (node && node->hasTagName(iframeTag)) { | 346 if (node && node->hasTagName(iframeTag)) { |
431 const AtomicString& ariaRole = getAttribute(roleAttr); | 347 const AtomicString& ariaRole = getAttribute(roleAttr); |
432 if (ariaRole == "none" || ariaRole == "presentation") | 348 if (ariaRole == "none" || ariaRole == "presentation") |
433 return IframePresentationalRole; | 349 return IframePresentationalRole; |
434 return IframeRole; | 350 return IframeRole; |
435 } | 351 } |
436 | 352 |
437 if (isEmbeddedObject()) | |
438 return EmbeddedObjectRole; | |
439 | |
440 if (node && node->hasTagName(figcaptionTag)) | |
441 return FigcaptionRole; | |
442 | |
443 if (node && node->hasTagName(figureTag)) | |
444 return FigureRole; | |
445 | |
446 // There should only be one banner/contentInfo per page. If header/footer ar
e being used within an article or section | 353 // There should only be one banner/contentInfo per page. If header/footer ar
e being used within an article or section |
447 // then it should not be exposed as whole page's banner/contentInfo | 354 // then it should not be exposed as whole page's banner/contentInfo |
448 if (node && node->hasTagName(headerTag) && !isDescendantOfElementType(articl
eTag) && !isDescendantOfElementType(sectionTag)) | 355 if (node && node->hasTagName(headerTag) && !isDescendantOfElementType(articl
eTag) && !isDescendantOfElementType(sectionTag)) |
449 return BannerRole; | 356 return BannerRole; |
450 if (node && node->hasTagName(footerTag) && !isDescendantOfElementType(articl
eTag) && !isDescendantOfElementType(sectionTag)) | 357 if (node && node->hasTagName(footerTag) && !isDescendantOfElementType(articl
eTag) && !isDescendantOfElementType(sectionTag)) |
451 return FooterRole; | 358 return FooterRole; |
452 | 359 |
453 if (isHTMLAnchorElement(node) && isClickable()) | 360 AccessibilityRole role = AXNodeObject::determineAccessibilityRoleUtil(); |
454 return LinkRole; | 361 if (role != UnknownRole) |
| 362 return role; |
455 | 363 |
456 if (m_renderer->isRenderBlockFlow()) | 364 if (m_renderer->isRenderBlockFlow()) |
457 return GroupRole; | 365 return GroupRole; |
458 | 366 |
459 // If the element does not have role, but it has ARIA attributes, accessibil
ity should fallback to exposing it as a group. | 367 // If the element does not have role, but it has ARIA attributes, accessibil
ity should fallback to exposing it as a group. |
460 if (supportsARIAAttributes()) | 368 if (supportsARIAAttributes()) |
461 return GroupRole; | 369 return GroupRole; |
462 | 370 |
463 return UnknownRole; | 371 return UnknownRole; |
464 } | 372 } |
(...skipping 2024 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2489 if (label && label->renderer()) { | 2397 if (label && label->renderer()) { |
2490 LayoutRect labelRect = axObjectCache()->getOrCreate(label)->elementR
ect(); | 2398 LayoutRect labelRect = axObjectCache()->getOrCreate(label)->elementR
ect(); |
2491 result.unite(labelRect); | 2399 result.unite(labelRect); |
2492 } | 2400 } |
2493 } | 2401 } |
2494 | 2402 |
2495 return result; | 2403 return result; |
2496 } | 2404 } |
2497 | 2405 |
2498 } // namespace blink | 2406 } // namespace blink |
OLD | NEW |