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 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
276 | 276 |
277 if (node && node->isLink()) { | 277 if (node && node->isLink()) { |
278 if (cssBox && cssBox->isImage()) | 278 if (cssBox && cssBox->isImage()) |
279 return ImageMapRole; | 279 return ImageMapRole; |
280 return LinkRole; | 280 return LinkRole; |
281 } | 281 } |
282 if (cssBox && cssBox->isListItem()) | 282 if (cssBox && cssBox->isListItem()) |
283 return ListItemRole; | 283 return ListItemRole; |
284 if (m_renderer->isListMarker()) | 284 if (m_renderer->isListMarker()) |
285 return ListMarkerRole; | 285 return ListMarkerRole; |
286 if (node && node->hasTagName(buttonTag)) | 286 if (isHTMLButtonElement(node)) |
287 return buttonRoleType(); | 287 return buttonRoleType(); |
288 if (node && node->hasTagName(legendTag)) | 288 if (isHTMLLegendElement(node)) |
289 return LegendRole; | 289 return LegendRole; |
290 if (m_renderer->isText()) | 290 if (m_renderer->isText()) |
291 return StaticTextRole; | 291 return StaticTextRole; |
292 if (cssBox && cssBox->isImage()) { | 292 if (cssBox && cssBox->isImage()) { |
293 if (node && node->hasTagName(inputTag)) | 293 if (isHTMLInputElement(node)) |
294 return ariaHasPopup() ? PopUpButtonRole : ButtonRole; | 294 return ariaHasPopup() ? PopUpButtonRole : ButtonRole; |
295 if (isSVGImage()) | 295 if (isSVGImage()) |
296 return SVGRootRole; | 296 return SVGRootRole; |
297 return ImageRole; | 297 return ImageRole; |
298 } | 298 } |
299 | 299 |
300 // Note: if JavaScript is disabled, the renderer won't be a RenderHTMLCanvas . | 300 // Note: if JavaScript is disabled, the renderer won't be a RenderHTMLCanvas . |
301 if (node && node->hasTagName(canvasTag) && m_renderer->isCanvas()) | 301 if (isHTMLCanvasElement(node) && m_renderer->isCanvas()) |
302 return CanvasRole; | 302 return CanvasRole; |
303 | 303 |
304 if (cssBox && cssBox->isRenderView()) | 304 if (cssBox && cssBox->isRenderView()) |
305 return WebAreaRole; | 305 return WebAreaRole; |
306 | 306 |
307 if (cssBox && cssBox->isTextField()) | 307 if (cssBox && cssBox->isTextField()) |
308 return TextFieldRole; | 308 return TextFieldRole; |
309 | 309 |
310 if (cssBox && cssBox->isTextArea()) | 310 if (cssBox && cssBox->isTextArea()) |
311 return TextAreaRole; | 311 return TextAreaRole; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
347 if (node && (node->hasTagName(rpTag) || node->hasTagName(rtTag))) | 347 if (node && (node->hasTagName(rpTag) || node->hasTagName(rtTag))) |
348 return AnnotationRole; | 348 return AnnotationRole; |
349 | 349 |
350 // Table sections should be ignored. | 350 // Table sections should be ignored. |
351 if (m_renderer->isTableSection()) | 351 if (m_renderer->isTableSection()) |
352 return IgnoredRole; | 352 return IgnoredRole; |
353 | 353 |
354 if (m_renderer->isHR()) | 354 if (m_renderer->isHR()) |
355 return HorizontalRuleRole; | 355 return HorizontalRuleRole; |
356 | 356 |
357 if (node && node->hasTagName(pTag)) | 357 if (isHTMLParagraphElement(node)) |
dmazzoni
2014/03/10 15:26:38
As long as we're discussing this function...I was
Inactive
2014/03/10 17:13:15
I think it would make sense. It would avoid all th
| |
358 return ParagraphRole; | 358 return ParagraphRole; |
359 | 359 |
360 if (node && node->hasTagName(labelTag)) | 360 if (isHTMLLabelElement(node)) |
361 return LabelRole; | 361 return LabelRole; |
362 | 362 |
363 if (node && node->hasTagName(divTag)) | 363 if (isHTMLDivElement(node)) |
364 return DivRole; | 364 return DivRole; |
365 | 365 |
366 if (node && node->hasTagName(formTag)) | 366 if (isHTMLFormElement(node)) |
367 return FormRole; | 367 return FormRole; |
368 | 368 |
369 if (node && node->hasTagName(articleTag)) | 369 if (node && node->hasTagName(articleTag)) |
370 return ArticleRole; | 370 return ArticleRole; |
371 | 371 |
372 if (node && node->hasTagName(mainTag)) | 372 if (node && node->hasTagName(mainTag)) |
373 return MainRole; | 373 return MainRole; |
374 | 374 |
375 if (node && node->hasTagName(navTag)) | 375 if (node && node->hasTagName(navTag)) |
376 return NavigationRole; | 376 return NavigationRole; |
377 | 377 |
378 if (node && node->hasTagName(asideTag)) | 378 if (node && node->hasTagName(asideTag)) |
379 return ComplementaryRole; | 379 return ComplementaryRole; |
380 | 380 |
381 if (node && node->hasTagName(sectionTag)) | 381 if (node && node->hasTagName(sectionTag)) |
382 return RegionRole; | 382 return RegionRole; |
383 | 383 |
384 if (node && node->hasTagName(addressTag)) | 384 if (node && node->hasTagName(addressTag)) |
385 return ContentInfoRole; | 385 return ContentInfoRole; |
386 | 386 |
387 if (node && node->hasTagName(dialogTag)) | 387 if (node && node->hasTagName(dialogTag)) |
388 return DialogRole; | 388 return DialogRole; |
389 | 389 |
390 // The HTML element should not be exposed as an element. That's what the Ren derView element does. | 390 // The HTML element should not be exposed as an element. That's what the Ren derView element does. |
391 if (node && node->hasTagName(htmlTag)) | 391 if (isHTMLHtmlElement(node)) |
392 return IgnoredRole; | 392 return IgnoredRole; |
393 | 393 |
394 // There should only be one banner/contentInfo per page. If header/footer ar e being used within an article or section | 394 // There should only be one banner/contentInfo per page. If header/footer ar e being used within an article or section |
395 // then it should not be exposed as whole page's banner/contentInfo | 395 // then it should not be exposed as whole page's banner/contentInfo |
396 if (node && node->hasTagName(headerTag) && !isDescendantOfElementType(articl eTag) && !isDescendantOfElementType(sectionTag)) | 396 if (node && node->hasTagName(headerTag) && !isDescendantOfElementType(articl eTag) && !isDescendantOfElementType(sectionTag)) |
397 return BannerRole; | 397 return BannerRole; |
398 if (node && node->hasTagName(footerTag) && !isDescendantOfElementType(articl eTag) && !isDescendantOfElementType(sectionTag)) | 398 if (node && node->hasTagName(footerTag) && !isDescendantOfElementType(articl eTag) && !isDescendantOfElementType(sectionTag)) |
399 return FooterRole; | 399 return FooterRole; |
400 | 400 |
401 if (node && node->hasTagName(aTag) && isClickable()) | 401 if (isHTMLAnchorElement(node) && isClickable()) |
402 return LinkRole; | 402 return LinkRole; |
403 | 403 |
404 if (m_renderer->isRenderBlockFlow()) | 404 if (m_renderer->isRenderBlockFlow()) |
405 return GroupRole; | 405 return GroupRole; |
406 | 406 |
407 // If the element does not have role, but it has ARIA attributes, accessibil ity should fallback to exposing it as a group. | 407 // If the element does not have role, but it has ARIA attributes, accessibil ity should fallback to exposing it as a group. |
408 if (supportsARIAAttributes()) | 408 if (supportsARIAAttributes()) |
409 return GroupRole; | 409 return GroupRole; |
410 | 410 |
411 return UnknownRole; | 411 return UnknownRole; |
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
655 | 655 |
656 // all controls are accessible | 656 // all controls are accessible |
657 if (isControl()) | 657 if (isControl()) |
658 return false; | 658 return false; |
659 | 659 |
660 if (ariaRoleAttribute() != UnknownRole) | 660 if (ariaRoleAttribute() != UnknownRole) |
661 return false; | 661 return false; |
662 | 662 |
663 // don't ignore labels, because they serve as TitleUIElements | 663 // don't ignore labels, because they serve as TitleUIElements |
664 Node* node = m_renderer->node(); | 664 Node* node = m_renderer->node(); |
665 if (node && node->hasTagName(labelTag)) | 665 if (isHTMLLabelElement(node)) |
666 return false; | 666 return false; |
667 | 667 |
668 // Anything that is content editable should not be ignored. | 668 // Anything that is content editable should not be ignored. |
669 // However, one cannot just call node->rendererIsEditable() since that will ask if its parents | 669 // However, one cannot just call node->rendererIsEditable() since that will ask if its parents |
670 // are also editable. Only the top level content editable region should be e xposed. | 670 // are also editable. Only the top level content editable region should be e xposed. |
671 if (hasContentEditableAttributeSet()) | 671 if (hasContentEditableAttributeSet()) |
672 return false; | 672 return false; |
673 | 673 |
674 // List items play an important role in defining the structure of lists. The y should not be ignored. | 674 // List items play an important role in defining the structure of lists. The y should not be ignored. |
675 if (roleValue() == ListItemRole) | 675 if (roleValue() == ListItemRole) |
676 return false; | 676 return false; |
677 | 677 |
678 if (roleValue() == DialogRole) | 678 if (roleValue() == DialogRole) |
679 return false; | 679 return false; |
680 | 680 |
681 // if this element has aria attributes on it, it should not be ignored. | 681 // if this element has aria attributes on it, it should not be ignored. |
682 if (supportsARIAAttributes()) | 682 if (supportsARIAAttributes()) |
683 return false; | 683 return false; |
684 | 684 |
685 // <span> tags are inline tags and not meant to convey information if they h ave no other aria | 685 // <span> tags are inline tags and not meant to convey information if they h ave no other aria |
686 // information on them. If we don't ignore them, they may emit signals expec ted to come from | 686 // information on them. If we don't ignore them, they may emit signals expec ted to come from |
687 // their parent. In addition, because included spans are GroupRole objects, and GroupRole | 687 // their parent. In addition, because included spans are GroupRole objects, and GroupRole |
688 // objects are often containers with meaningful information, the inclusion o f a span can have | 688 // objects are often containers with meaningful information, the inclusion o f a span can have |
689 // the side effect of causing the immediate parent accessible to be ignored. This is especially | 689 // the side effect of causing the immediate parent accessible to be ignored. This is especially |
690 // problematic for platforms which have distinct roles for textual block ele ments. | 690 // problematic for platforms which have distinct roles for textual block ele ments. |
691 if (node && node->hasTagName(spanTag)) | 691 if (isHTMLSpanElement(node)) |
692 return true; | 692 return true; |
693 | 693 |
694 if (m_renderer->isRenderBlockFlow() && m_renderer->childrenInline() && !canS etFocusAttribute()) | 694 if (m_renderer->isRenderBlockFlow() && m_renderer->childrenInline() && !canS etFocusAttribute()) |
695 return !toRenderBlock(m_renderer)->firstLineBox() && !mouseButtonListene r(); | 695 return !toRenderBlock(m_renderer)->firstLineBox() && !mouseButtonListene r(); |
696 | 696 |
697 // ignore images seemingly used as spacers | 697 // ignore images seemingly used as spacers |
698 if (isImage()) { | 698 if (isImage()) { |
699 | 699 |
700 // If the image can take focus, it should not be ignored, lest the user not be able to interact with something important. | 700 // If the image can take focus, it should not be ignored, lest the user not be able to interact with something important. |
701 if (canSetFocusAttribute()) | 701 if (canSetFocusAttribute()) |
(...skipping 816 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1518 } | 1518 } |
1519 | 1519 |
1520 // bail if none found | 1520 // bail if none found |
1521 if (!currRenderer) | 1521 if (!currRenderer) |
1522 return 0; | 1522 return 0; |
1523 | 1523 |
1524 // search up the DOM tree for an anchor element | 1524 // search up the DOM tree for an anchor element |
1525 // NOTE: this assumes that any non-image with an anchor is an HTMLAnchorElem ent | 1525 // NOTE: this assumes that any non-image with an anchor is an HTMLAnchorElem ent |
1526 Node* node = currRenderer->node(); | 1526 Node* node = currRenderer->node(); |
1527 for ( ; node; node = node->parentNode()) { | 1527 for ( ; node; node = node->parentNode()) { |
1528 if (node->hasTagName(aTag) || (node->renderer() && cache->getOrCreate(no de->renderer())->isAnchor())) | 1528 if (isHTMLAnchorElement(*node) || (node->renderer() && cache->getOrCreat e(node->renderer())->isAnchor())) |
1529 return toElement(node); | 1529 return toElement(node); |
1530 } | 1530 } |
1531 | 1531 |
1532 return 0; | 1532 return 0; |
1533 } | 1533 } |
1534 | 1534 |
1535 Widget* AXRenderObject::widgetForAttachmentView() const | 1535 Widget* AXRenderObject::widgetForAttachmentView() const |
1536 { | 1536 { |
1537 if (!isAttachment()) | 1537 if (!isAttachment()) |
1538 return 0; | 1538 return 0; |
(...skipping 627 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2166 if (!areaObject->accessibilityIsIgnored()) | 2166 if (!areaObject->accessibilityIsIgnored()) |
2167 m_children.append(areaObject); | 2167 m_children.append(areaObject); |
2168 else | 2168 else |
2169 axObjectCache()->remove(areaObject->axObjectID()); | 2169 axObjectCache()->remove(areaObject->axObjectID()); |
2170 } | 2170 } |
2171 } | 2171 } |
2172 } | 2172 } |
2173 | 2173 |
2174 void AXRenderObject::addCanvasChildren() | 2174 void AXRenderObject::addCanvasChildren() |
2175 { | 2175 { |
2176 if (!node() || !node()->hasTagName(canvasTag)) | 2176 if (!isHTMLCanvasElement(node())) |
2177 return; | 2177 return; |
2178 | 2178 |
2179 // If it's a canvas, it won't have rendered children, but it might have acce ssible fallback content. | 2179 // If it's a canvas, it won't have rendered children, but it might have acce ssible fallback content. |
2180 // Clear m_haveChildren because AXNodeObject::addChildren will expect it to be false. | 2180 // Clear m_haveChildren because AXNodeObject::addChildren will expect it to be false. |
2181 ASSERT(!m_children.size()); | 2181 ASSERT(!m_children.size()); |
2182 m_haveChildren = false; | 2182 m_haveChildren = false; |
2183 AXNodeObject::addChildren(); | 2183 AXNodeObject::addChildren(); |
2184 } | 2184 } |
2185 | 2185 |
2186 void AXRenderObject::addAttachmentChildren() | 2186 void AXRenderObject::addAttachmentChildren() |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2319 if (label && label->renderer()) { | 2319 if (label && label->renderer()) { |
2320 LayoutRect labelRect = axObjectCache()->getOrCreate(label)->elementR ect(); | 2320 LayoutRect labelRect = axObjectCache()->getOrCreate(label)->elementR ect(); |
2321 result.unite(labelRect); | 2321 result.unite(labelRect); |
2322 } | 2322 } |
2323 } | 2323 } |
2324 | 2324 |
2325 return result; | 2325 return result; |
2326 } | 2326 } |
2327 | 2327 |
2328 } // namespace WebCore | 2328 } // namespace WebCore |
OLD | NEW |