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 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
73 #include "modules/accessibility/AXTable.h" | 73 #include "modules/accessibility/AXTable.h" |
74 #include "platform/text/PlatformLocale.h" | 74 #include "platform/text/PlatformLocale.h" |
75 #include "wtf/StdLibExtras.h" | 75 #include "wtf/StdLibExtras.h" |
76 | 76 |
77 using blink::WebLocalizedString; | 77 using blink::WebLocalizedString; |
78 | 78 |
79 namespace blink { | 79 namespace blink { |
80 | 80 |
81 using namespace HTMLNames; | 81 using namespace HTMLNames; |
82 | 82 |
83 static inline RenderObject* firstChildInContinuation(const RenderInline& rendere
r) | 83 static inline LayoutObject* firstChildInContinuation(const RenderInline& rendere
r) |
84 { | 84 { |
85 RenderBoxModelObject* r = renderer.continuation(); | 85 RenderBoxModelObject* r = renderer.continuation(); |
86 | 86 |
87 while (r) { | 87 while (r) { |
88 if (r->isRenderBlock()) | 88 if (r->isRenderBlock()) |
89 return r; | 89 return r; |
90 if (RenderObject* child = r->slowFirstChild()) | 90 if (LayoutObject* child = r->slowFirstChild()) |
91 return child; | 91 return child; |
92 r = toRenderInline(r)->continuation(); | 92 r = toRenderInline(r)->continuation(); |
93 } | 93 } |
94 | 94 |
95 return 0; | 95 return 0; |
96 } | 96 } |
97 | 97 |
98 static inline bool isInlineWithContinuation(RenderObject* object) | 98 static inline bool isInlineWithContinuation(LayoutObject* object) |
99 { | 99 { |
100 if (!object->isBoxModelObject()) | 100 if (!object->isBoxModelObject()) |
101 return false; | 101 return false; |
102 | 102 |
103 RenderBoxModelObject* renderer = toRenderBoxModelObject(object); | 103 RenderBoxModelObject* renderer = toRenderBoxModelObject(object); |
104 if (!renderer->isRenderInline()) | 104 if (!renderer->isRenderInline()) |
105 return false; | 105 return false; |
106 | 106 |
107 return toRenderInline(renderer)->continuation(); | 107 return toRenderInline(renderer)->continuation(); |
108 } | 108 } |
109 | 109 |
110 static inline RenderObject* firstChildConsideringContinuation(RenderObject* rend
erer) | 110 static inline LayoutObject* firstChildConsideringContinuation(LayoutObject* rend
erer) |
111 { | 111 { |
112 RenderObject* firstChild = renderer->slowFirstChild(); | 112 LayoutObject* firstChild = renderer->slowFirstChild(); |
113 | 113 |
114 if (!firstChild && isInlineWithContinuation(renderer)) | 114 if (!firstChild && isInlineWithContinuation(renderer)) |
115 firstChild = firstChildInContinuation(toRenderInline(*renderer)); | 115 firstChild = firstChildInContinuation(toRenderInline(*renderer)); |
116 | 116 |
117 return firstChild; | 117 return firstChild; |
118 } | 118 } |
119 | 119 |
120 static inline RenderInline* startOfContinuations(RenderObject* r) | 120 static inline RenderInline* startOfContinuations(LayoutObject* r) |
121 { | 121 { |
122 if (r->isInlineElementContinuation()) { | 122 if (r->isInlineElementContinuation()) { |
123 return toRenderInline(r->node()->renderer()); | 123 return toRenderInline(r->node()->renderer()); |
124 } | 124 } |
125 | 125 |
126 // Blocks with a previous continuation always have a next continuation | 126 // Blocks with a previous continuation always have a next continuation |
127 if (r->isRenderBlock() && toRenderBlock(r)->inlineElementContinuation()) | 127 if (r->isRenderBlock() && toRenderBlock(r)->inlineElementContinuation()) |
128 return toRenderInline(toRenderBlock(r)->inlineElementContinuation()->nod
e()->renderer()); | 128 return toRenderInline(toRenderBlock(r)->inlineElementContinuation()->nod
e()->renderer()); |
129 | 129 |
130 return 0; | 130 return 0; |
131 } | 131 } |
132 | 132 |
133 static inline RenderObject* endOfContinuations(RenderObject* renderer) | 133 static inline LayoutObject* endOfContinuations(LayoutObject* renderer) |
134 { | 134 { |
135 RenderObject* prev = renderer; | 135 LayoutObject* prev = renderer; |
136 RenderObject* cur = renderer; | 136 LayoutObject* cur = renderer; |
137 | 137 |
138 if (!cur->isRenderInline() && !cur->isRenderBlock()) | 138 if (!cur->isRenderInline() && !cur->isRenderBlock()) |
139 return renderer; | 139 return renderer; |
140 | 140 |
141 while (cur) { | 141 while (cur) { |
142 prev = cur; | 142 prev = cur; |
143 if (cur->isRenderInline()) { | 143 if (cur->isRenderInline()) { |
144 cur = toRenderInline(cur)->inlineElementContinuation(); | 144 cur = toRenderInline(cur)->inlineElementContinuation(); |
145 ASSERT(cur || !toRenderInline(prev)->continuation()); | 145 ASSERT(cur || !toRenderInline(prev)->continuation()); |
146 } else { | 146 } else { |
147 cur = toRenderBlock(cur)->inlineElementContinuation(); | 147 cur = toRenderBlock(cur)->inlineElementContinuation(); |
148 } | 148 } |
149 } | 149 } |
150 | 150 |
151 return prev; | 151 return prev; |
152 } | 152 } |
153 | 153 |
154 static inline bool lastChildHasContinuation(RenderObject* renderer) | 154 static inline bool lastChildHasContinuation(LayoutObject* renderer) |
155 { | 155 { |
156 RenderObject* lastChild = renderer->slowLastChild(); | 156 LayoutObject* lastChild = renderer->slowLastChild(); |
157 return lastChild && isInlineWithContinuation(lastChild); | 157 return lastChild && isInlineWithContinuation(lastChild); |
158 } | 158 } |
159 | 159 |
160 static RenderBoxModelObject* nextContinuation(RenderObject* renderer) | 160 static RenderBoxModelObject* nextContinuation(LayoutObject* renderer) |
161 { | 161 { |
162 ASSERT(renderer); | 162 ASSERT(renderer); |
163 if (renderer->isRenderInline() && !renderer->isReplaced()) | 163 if (renderer->isRenderInline() && !renderer->isReplaced()) |
164 return toRenderInline(renderer)->continuation(); | 164 return toRenderInline(renderer)->continuation(); |
165 if (renderer->isRenderBlock()) | 165 if (renderer->isRenderBlock()) |
166 return toRenderBlock(renderer)->inlineElementContinuation(); | 166 return toRenderBlock(renderer)->inlineElementContinuation(); |
167 return 0; | 167 return 0; |
168 } | 168 } |
169 | 169 |
170 AXRenderObject::AXRenderObject(RenderObject* renderer, AXObjectCacheImpl* axObje
ctCache) | 170 AXRenderObject::AXRenderObject(LayoutObject* renderer, AXObjectCacheImpl* axObje
ctCache) |
171 : AXNodeObject(renderer->node(), axObjectCache) | 171 : AXNodeObject(renderer->node(), axObjectCache) |
172 , m_renderer(renderer) | 172 , m_renderer(renderer) |
173 , m_cachedElementRectDirty(true) | 173 , m_cachedElementRectDirty(true) |
174 { | 174 { |
175 #if ENABLE(ASSERT) | 175 #if ENABLE(ASSERT) |
176 m_renderer->setHasAXObject(true); | 176 m_renderer->setHasAXObject(true); |
177 #endif | 177 #endif |
178 } | 178 } |
179 | 179 |
180 PassRefPtr<AXRenderObject> AXRenderObject::create(RenderObject* renderer, AXObje
ctCacheImpl* axObjectCache) | 180 PassRefPtr<AXRenderObject> AXRenderObject::create(LayoutObject* renderer, AXObje
ctCacheImpl* axObjectCache) |
181 { | 181 { |
182 return adoptRef(new AXRenderObject(renderer, axObjectCache)); | 182 return adoptRef(new AXRenderObject(renderer, axObjectCache)); |
183 } | 183 } |
184 | 184 |
185 AXRenderObject::~AXRenderObject() | 185 AXRenderObject::~AXRenderObject() |
186 { | 186 { |
187 ASSERT(isDetached()); | 187 ASSERT(isDetached()); |
188 } | 188 } |
189 | 189 |
190 LayoutRect AXRenderObject::elementRect() const | 190 LayoutRect AXRenderObject::elementRect() const |
(...skipping 10 matching lines...) Expand all Loading... |
201 toAXRenderObject(obj)->checkCachedElementRect(); | 201 toAXRenderObject(obj)->checkCachedElementRect(); |
202 } | 202 } |
203 for (const AXObject* obj = this; obj; obj = obj->parentObject()) { | 203 for (const AXObject* obj = this; obj; obj = obj->parentObject()) { |
204 if (obj->isAXRenderObject()) | 204 if (obj->isAXRenderObject()) |
205 toAXRenderObject(obj)->updateCachedElementRect(); | 205 toAXRenderObject(obj)->updateCachedElementRect(); |
206 } | 206 } |
207 | 207 |
208 return m_cachedElementRect; | 208 return m_cachedElementRect; |
209 } | 209 } |
210 | 210 |
211 void AXRenderObject::setRenderer(RenderObject* renderer) | 211 void AXRenderObject::setRenderer(LayoutObject* renderer) |
212 { | 212 { |
213 m_renderer = renderer; | 213 m_renderer = renderer; |
214 setNode(renderer->node()); | 214 setNode(renderer->node()); |
215 } | 215 } |
216 | 216 |
217 RenderBoxModelObject* AXRenderObject::renderBoxModelObject() const | 217 RenderBoxModelObject* AXRenderObject::renderBoxModelObject() const |
218 { | 218 { |
219 if (!m_renderer || !m_renderer->isBoxModelObject()) | 219 if (!m_renderer || !m_renderer->isBoxModelObject()) |
220 return 0; | 220 return 0; |
221 return toRenderBoxModelObject(m_renderer); | 221 return toRenderBoxModelObject(m_renderer); |
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
569 // An ARIA tree can only have tree items and static text as children. | 569 // An ARIA tree can only have tree items and static text as children. |
570 if (!isAllowedChildOfTree()) | 570 if (!isAllowedChildOfTree()) |
571 return true; | 571 return true; |
572 | 572 |
573 // TODO: we should refactor this - but right now this is necessary to make | 573 // TODO: we should refactor this - but right now this is necessary to make |
574 // sure scroll areas stay in the tree. | 574 // sure scroll areas stay in the tree. |
575 if (isAttachment()) | 575 if (isAttachment()) |
576 return false; | 576 return false; |
577 | 577 |
578 // ignore popup menu items because AppKit does | 578 // ignore popup menu items because AppKit does |
579 for (RenderObject* parent = m_renderer->parent(); parent; parent = parent->p
arent()) { | 579 for (LayoutObject* parent = m_renderer->parent(); parent; parent = parent->p
arent()) { |
580 if (parent->isBoxModelObject() && toRenderBoxModelObject(parent)->isMenu
List()) | 580 if (parent->isBoxModelObject() && toRenderBoxModelObject(parent)->isMenu
List()) |
581 return true; | 581 return true; |
582 } | 582 } |
583 | 583 |
584 // find out if this element is inside of a label element. | 584 // find out if this element is inside of a label element. |
585 // if so, it may be ignored because it's the label for a checkbox or radio b
utton | 585 // if so, it may be ignored because it's the label for a checkbox or radio b
utton |
586 AXObject* controlObject = correspondingControlForLabelElement(); | 586 AXObject* controlObject = correspondingControlForLabelElement(); |
587 if (controlObject && !controlObject->exposesTitleUIElement() && controlObjec
t->isCheckboxOrRadio()) | 587 if (controlObject && !controlObject->exposesTitleUIElement() && controlObjec
t->isCheckboxOrRadio()) |
588 return true; | 588 return true; |
589 | 589 |
(...skipping 629 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1219 | 1219 |
1220 const AtomicString& ariaHelp = getAttribute(aria_helpAttr); | 1220 const AtomicString& ariaHelp = getAttribute(aria_helpAttr); |
1221 if (!ariaHelp.isEmpty()) | 1221 if (!ariaHelp.isEmpty()) |
1222 return ariaHelp; | 1222 return ariaHelp; |
1223 | 1223 |
1224 String describedBy = ariaDescribedByAttribute(); | 1224 String describedBy = ariaDescribedByAttribute(); |
1225 if (!describedBy.isEmpty()) | 1225 if (!describedBy.isEmpty()) |
1226 return describedBy; | 1226 return describedBy; |
1227 | 1227 |
1228 String description = accessibilityDescription(); | 1228 String description = accessibilityDescription(); |
1229 for (RenderObject* curr = m_renderer; curr; curr = curr->parent()) { | 1229 for (LayoutObject* curr = m_renderer; curr; curr = curr->parent()) { |
1230 if (curr->node() && curr->node()->isHTMLElement()) { | 1230 if (curr->node() && curr->node()->isHTMLElement()) { |
1231 const AtomicString& summary = toElement(curr->node())->getAttribute(
summaryAttr); | 1231 const AtomicString& summary = toElement(curr->node())->getAttribute(
summaryAttr); |
1232 if (!summary.isEmpty()) | 1232 if (!summary.isEmpty()) |
1233 return summary; | 1233 return summary; |
1234 | 1234 |
1235 // The title attribute should be used as help text unless it is alre
ady being used as descriptive text. | 1235 // The title attribute should be used as help text unless it is alre
ady being used as descriptive text. |
1236 const AtomicString& title = toElement(curr->node())->getAttribute(ti
tleAttr); | 1236 const AtomicString& title = toElement(curr->node())->getAttribute(ti
tleAttr); |
1237 if (!title.isEmpty() && description != title) | 1237 if (!title.isEmpty() && description != title) |
1238 return title; | 1238 return title; |
1239 } | 1239 } |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1352 // Allow the hit test to return media control buttons. | 1352 // Allow the hit test to return media control buttons. |
1353 if (node->isInShadowTree() && (!isHTMLInputElement(*node) || !node->isMediaC
ontrolElement())) | 1353 if (node->isInShadowTree() && (!isHTMLInputElement(*node) || !node->isMediaC
ontrolElement())) |
1354 node = node->shadowHost(); | 1354 node = node->shadowHost(); |
1355 | 1355 |
1356 if (isHTMLAreaElement(node)) | 1356 if (isHTMLAreaElement(node)) |
1357 return accessibilityImageMapHitTest(toHTMLAreaElement(node), point); | 1357 return accessibilityImageMapHitTest(toHTMLAreaElement(node), point); |
1358 | 1358 |
1359 if (isHTMLOptionElement(node)) | 1359 if (isHTMLOptionElement(node)) |
1360 node = toHTMLOptionElement(*node).ownerSelectElement(); | 1360 node = toHTMLOptionElement(*node).ownerSelectElement(); |
1361 | 1361 |
1362 RenderObject* obj = node->renderer(); | 1362 LayoutObject* obj = node->renderer(); |
1363 if (!obj) | 1363 if (!obj) |
1364 return 0; | 1364 return 0; |
1365 | 1365 |
1366 AXObject* result = axObjectCache()->getOrCreate(obj); | 1366 AXObject* result = axObjectCache()->getOrCreate(obj); |
1367 result->updateChildrenIfNecessary(); | 1367 result->updateChildrenIfNecessary(); |
1368 | 1368 |
1369 // Allow the element to perform any hit-testing it might need to do to reach
non-render children. | 1369 // Allow the element to perform any hit-testing it might need to do to reach
non-render children. |
1370 result = result->elementAccessibilityHitTest(point); | 1370 result = result->elementAccessibilityHitTest(point); |
1371 | 1371 |
1372 if (result && result->accessibilityIsIgnored()) { | 1372 if (result && result->accessibilityIsIgnored()) { |
(...skipping 30 matching lines...) Expand all Loading... |
1403 if (ariaRoleAttribute() == MenuBarRole) | 1403 if (ariaRoleAttribute() == MenuBarRole) |
1404 return axObjectCache()->getOrCreate(m_renderer->parent()); | 1404 return axObjectCache()->getOrCreate(m_renderer->parent()); |
1405 | 1405 |
1406 // menuButton and its corresponding menu are DOM siblings, but Accessibility
needs them to be parent/child | 1406 // menuButton and its corresponding menu are DOM siblings, but Accessibility
needs them to be parent/child |
1407 if (ariaRoleAttribute() == MenuRole) { | 1407 if (ariaRoleAttribute() == MenuRole) { |
1408 AXObject* parent = menuButtonForMenu(); | 1408 AXObject* parent = menuButtonForMenu(); |
1409 if (parent) | 1409 if (parent) |
1410 return parent; | 1410 return parent; |
1411 } | 1411 } |
1412 | 1412 |
1413 RenderObject* parentObj = renderParentObject(); | 1413 LayoutObject* parentObj = renderParentObject(); |
1414 if (parentObj) | 1414 if (parentObj) |
1415 return axObjectCache()->getOrCreate(parentObj); | 1415 return axObjectCache()->getOrCreate(parentObj); |
1416 | 1416 |
1417 // WebArea's parent should be the scroll view containing it. | 1417 // WebArea's parent should be the scroll view containing it. |
1418 if (isWebArea()) | 1418 if (isWebArea()) |
1419 return axObjectCache()->getOrCreate(m_renderer->frame()->view()); | 1419 return axObjectCache()->getOrCreate(m_renderer->frame()->view()); |
1420 | 1420 |
1421 return 0; | 1421 return 0; |
1422 } | 1422 } |
1423 | 1423 |
1424 AXObject* AXRenderObject::computeParentIfExists() const | 1424 AXObject* AXRenderObject::computeParentIfExists() const |
1425 { | 1425 { |
1426 if (!m_renderer) | 1426 if (!m_renderer) |
1427 return 0; | 1427 return 0; |
1428 | 1428 |
1429 if (ariaRoleAttribute() == MenuBarRole) | 1429 if (ariaRoleAttribute() == MenuBarRole) |
1430 return axObjectCache()->get(m_renderer->parent()); | 1430 return axObjectCache()->get(m_renderer->parent()); |
1431 | 1431 |
1432 // menuButton and its corresponding menu are DOM siblings, but Accessibility
needs them to be parent/child | 1432 // menuButton and its corresponding menu are DOM siblings, but Accessibility
needs them to be parent/child |
1433 if (ariaRoleAttribute() == MenuRole) { | 1433 if (ariaRoleAttribute() == MenuRole) { |
1434 AXObject* parent = menuButtonForMenu(); | 1434 AXObject* parent = menuButtonForMenu(); |
1435 if (parent) | 1435 if (parent) |
1436 return parent; | 1436 return parent; |
1437 } | 1437 } |
1438 | 1438 |
1439 RenderObject* parentObj = renderParentObject(); | 1439 LayoutObject* parentObj = renderParentObject(); |
1440 if (parentObj) | 1440 if (parentObj) |
1441 return axObjectCache()->get(parentObj); | 1441 return axObjectCache()->get(parentObj); |
1442 | 1442 |
1443 // WebArea's parent should be the scroll view containing it. | 1443 // WebArea's parent should be the scroll view containing it. |
1444 if (isWebArea()) | 1444 if (isWebArea()) |
1445 return axObjectCache()->get(m_renderer->frame()->view()); | 1445 return axObjectCache()->get(m_renderer->frame()->view()); |
1446 | 1446 |
1447 return 0; | 1447 return 0; |
1448 } | 1448 } |
1449 | 1449 |
1450 // | 1450 // |
1451 // Low-level accessibility tree exploration, only for use within the accessibili
ty module. | 1451 // Low-level accessibility tree exploration, only for use within the accessibili
ty module. |
1452 // | 1452 // |
1453 | 1453 |
1454 AXObject* AXRenderObject::firstChild() const | 1454 AXObject* AXRenderObject::firstChild() const |
1455 { | 1455 { |
1456 if (!m_renderer) | 1456 if (!m_renderer) |
1457 return 0; | 1457 return 0; |
1458 | 1458 |
1459 RenderObject* firstChild = firstChildConsideringContinuation(m_renderer); | 1459 LayoutObject* firstChild = firstChildConsideringContinuation(m_renderer); |
1460 | 1460 |
1461 if (!firstChild) | 1461 if (!firstChild) |
1462 return 0; | 1462 return 0; |
1463 | 1463 |
1464 return axObjectCache()->getOrCreate(firstChild); | 1464 return axObjectCache()->getOrCreate(firstChild); |
1465 } | 1465 } |
1466 | 1466 |
1467 AXObject* AXRenderObject::nextSibling() const | 1467 AXObject* AXRenderObject::nextSibling() const |
1468 { | 1468 { |
1469 if (!m_renderer) | 1469 if (!m_renderer) |
1470 return 0; | 1470 return 0; |
1471 | 1471 |
1472 RenderObject* nextSibling = 0; | 1472 LayoutObject* nextSibling = 0; |
1473 | 1473 |
1474 RenderInline* inlineContinuation = m_renderer->isRenderBlock() ? toRenderBlo
ck(m_renderer)->inlineElementContinuation() : 0; | 1474 RenderInline* inlineContinuation = m_renderer->isRenderBlock() ? toRenderBlo
ck(m_renderer)->inlineElementContinuation() : 0; |
1475 if (inlineContinuation) { | 1475 if (inlineContinuation) { |
1476 // Case 1: node is a block and has an inline continuation. Next sibling
is the inline continuation's first child. | 1476 // Case 1: node is a block and has an inline continuation. Next sibling
is the inline continuation's first child. |
1477 nextSibling = firstChildConsideringContinuation(inlineContinuation); | 1477 nextSibling = firstChildConsideringContinuation(inlineContinuation); |
1478 } else if (m_renderer->isAnonymousBlock() && lastChildHasContinuation(m_rend
erer)) { | 1478 } else if (m_renderer->isAnonymousBlock() && lastChildHasContinuation(m_rend
erer)) { |
1479 // Case 2: Anonymous block parent of the start of a continuation - skip
all the way to | 1479 // Case 2: Anonymous block parent of the start of a continuation - skip
all the way to |
1480 // after the parent of the end, since everything in between will be link
ed up via the continuation. | 1480 // after the parent of the end, since everything in between will be link
ed up via the continuation. |
1481 RenderObject* lastParent = endOfContinuations(toRenderBlock(m_renderer)-
>lastChild())->parent(); | 1481 LayoutObject* lastParent = endOfContinuations(toRenderBlock(m_renderer)-
>lastChild())->parent(); |
1482 while (lastChildHasContinuation(lastParent)) | 1482 while (lastChildHasContinuation(lastParent)) |
1483 lastParent = endOfContinuations(lastParent->slowLastChild())->parent
(); | 1483 lastParent = endOfContinuations(lastParent->slowLastChild())->parent
(); |
1484 nextSibling = lastParent->nextSibling(); | 1484 nextSibling = lastParent->nextSibling(); |
1485 } else if (RenderObject* ns = m_renderer->nextSibling()) { | 1485 } else if (LayoutObject* ns = m_renderer->nextSibling()) { |
1486 // Case 3: node has an actual next sibling | 1486 // Case 3: node has an actual next sibling |
1487 nextSibling = ns; | 1487 nextSibling = ns; |
1488 } else if (isInlineWithContinuation(m_renderer)) { | 1488 } else if (isInlineWithContinuation(m_renderer)) { |
1489 // Case 4: node is an inline with a continuation. Next sibling is the ne
xt sibling of the end | 1489 // Case 4: node is an inline with a continuation. Next sibling is the ne
xt sibling of the end |
1490 // of the continuation chain. | 1490 // of the continuation chain. |
1491 nextSibling = endOfContinuations(m_renderer)->nextSibling(); | 1491 nextSibling = endOfContinuations(m_renderer)->nextSibling(); |
1492 } else if (isInlineWithContinuation(m_renderer->parent())) { | 1492 } else if (isInlineWithContinuation(m_renderer->parent())) { |
1493 // Case 5: node has no next sibling, and its parent is an inline with a
continuation. | 1493 // Case 5: node has no next sibling, and its parent is an inline with a
continuation. |
1494 RenderObject* continuation = toRenderInline(m_renderer->parent())->conti
nuation(); | 1494 LayoutObject* continuation = toRenderInline(m_renderer->parent())->conti
nuation(); |
1495 | 1495 |
1496 if (continuation->isRenderBlock()) { | 1496 if (continuation->isRenderBlock()) { |
1497 // Case 5a: continuation is a block - in this case the block itself
is the next sibling. | 1497 // Case 5a: continuation is a block - in this case the block itself
is the next sibling. |
1498 nextSibling = continuation; | 1498 nextSibling = continuation; |
1499 } else { | 1499 } else { |
1500 // Case 5b: continuation is an inline - in this case the inline's fi
rst child is the next sibling. | 1500 // Case 5b: continuation is an inline - in this case the inline's fi
rst child is the next sibling. |
1501 nextSibling = firstChildConsideringContinuation(continuation); | 1501 nextSibling = firstChildConsideringContinuation(continuation); |
1502 } | 1502 } |
1503 } | 1503 } |
1504 | 1504 |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1555 | 1555 |
1556 void AXRenderObject::clearChildren() | 1556 void AXRenderObject::clearChildren() |
1557 { | 1557 { |
1558 AXObject::clearChildren(); | 1558 AXObject::clearChildren(); |
1559 m_childrenDirty = false; | 1559 m_childrenDirty = false; |
1560 } | 1560 } |
1561 | 1561 |
1562 AXObject* AXRenderObject::observableObject() const | 1562 AXObject* AXRenderObject::observableObject() const |
1563 { | 1563 { |
1564 // Find the object going up the parent chain that is used in accessibility t
o monitor certain notifications. | 1564 // Find the object going up the parent chain that is used in accessibility t
o monitor certain notifications. |
1565 for (RenderObject* renderer = m_renderer; renderer && renderer->node(); rend
erer = renderer->parent()) { | 1565 for (LayoutObject* renderer = m_renderer; renderer && renderer->node(); rend
erer = renderer->parent()) { |
1566 if (renderObjectIsObservable(renderer)) | 1566 if (layoutObjectIsObservable(renderer)) |
1567 return axObjectCache()->getOrCreate(renderer); | 1567 return axObjectCache()->getOrCreate(renderer); |
1568 } | 1568 } |
1569 | 1569 |
1570 return 0; | 1570 return 0; |
1571 } | 1571 } |
1572 | 1572 |
1573 // | 1573 // |
1574 // Properties of the object's owning document or page. | 1574 // Properties of the object's owning document or page. |
1575 // | 1575 // |
1576 | 1576 |
(...skipping 24 matching lines...) Expand all Loading... |
1601 if (!m_renderer) | 1601 if (!m_renderer) |
1602 return 0; | 1602 return 0; |
1603 return &m_renderer->document(); | 1603 return &m_renderer->document(); |
1604 } | 1604 } |
1605 | 1605 |
1606 FrameView* AXRenderObject::documentFrameView() const | 1606 FrameView* AXRenderObject::documentFrameView() const |
1607 { | 1607 { |
1608 if (!m_renderer) | 1608 if (!m_renderer) |
1609 return 0; | 1609 return 0; |
1610 | 1610 |
1611 // this is the RenderObject's Document's LocalFrame's FrameView | 1611 // this is the LayoutObject's Document's LocalFrame's FrameView |
1612 return m_renderer->document().view(); | 1612 return m_renderer->document().view(); |
1613 } | 1613 } |
1614 | 1614 |
1615 Element* AXRenderObject::anchorElement() const | 1615 Element* AXRenderObject::anchorElement() const |
1616 { | 1616 { |
1617 if (!m_renderer) | 1617 if (!m_renderer) |
1618 return 0; | 1618 return 0; |
1619 | 1619 |
1620 AXObjectCacheImpl* cache = axObjectCache(); | 1620 AXObjectCacheImpl* cache = axObjectCache(); |
1621 RenderObject* currRenderer; | 1621 LayoutObject* currRenderer; |
1622 | 1622 |
1623 // Search up the render tree for a RenderObject with a DOM node. Defer to an
earlier continuation, though. | 1623 // Search up the render tree for a LayoutObject with a DOM node. Defer to an
earlier continuation, though. |
1624 for (currRenderer = m_renderer; currRenderer && !currRenderer->node(); currR
enderer = currRenderer->parent()) { | 1624 for (currRenderer = m_renderer; currRenderer && !currRenderer->node(); currR
enderer = currRenderer->parent()) { |
1625 if (currRenderer->isAnonymousBlock()) { | 1625 if (currRenderer->isAnonymousBlock()) { |
1626 RenderObject* continuation = toRenderBlock(currRenderer)->continuati
on(); | 1626 LayoutObject* continuation = toRenderBlock(currRenderer)->continuati
on(); |
1627 if (continuation) | 1627 if (continuation) |
1628 return cache->getOrCreate(continuation)->anchorElement(); | 1628 return cache->getOrCreate(continuation)->anchorElement(); |
1629 } | 1629 } |
1630 } | 1630 } |
1631 | 1631 |
1632 // bail if none found | 1632 // bail if none found |
1633 if (!currRenderer) | 1633 if (!currRenderer) |
1634 return 0; | 1634 return 0; |
1635 | 1635 |
1636 // search up the DOM tree for an anchor element | 1636 // search up the DOM tree for an anchor element |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1805 // | 1805 // |
1806 // Text metrics. Most of these should be deprecated, needs major cleanup. | 1806 // Text metrics. Most of these should be deprecated, needs major cleanup. |
1807 // | 1807 // |
1808 | 1808 |
1809 // NOTE: Consider providing this utility method as AX API | 1809 // NOTE: Consider providing this utility method as AX API |
1810 int AXRenderObject::index(const VisiblePosition& position) const | 1810 int AXRenderObject::index(const VisiblePosition& position) const |
1811 { | 1811 { |
1812 if (position.isNull() || !isTextControl()) | 1812 if (position.isNull() || !isTextControl()) |
1813 return -1; | 1813 return -1; |
1814 | 1814 |
1815 if (renderObjectContainsPosition(m_renderer, position.deepEquivalent())) | 1815 if (layoutObjectContainsPosition(m_renderer, position.deepEquivalent())) |
1816 return indexForVisiblePosition(position); | 1816 return indexForVisiblePosition(position); |
1817 | 1817 |
1818 return -1; | 1818 return -1; |
1819 } | 1819 } |
1820 | 1820 |
1821 VisiblePosition AXRenderObject::visiblePositionForIndex(int index) const | 1821 VisiblePosition AXRenderObject::visiblePositionForIndex(int index) const |
1822 { | 1822 { |
1823 if (!m_renderer) | 1823 if (!m_renderer) |
1824 return VisiblePosition(); | 1824 return VisiblePosition(); |
1825 | 1825 |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2034 AXObject::AccessibilityChildrenVector children = parent->children(); | 2034 AXObject::AccessibilityChildrenVector children = parent->children(); |
2035 unsigned count = children.size(); | 2035 unsigned count = children.size(); |
2036 for (unsigned k = 0; k < count; ++k) { | 2036 for (unsigned k = 0; k < count; ++k) { |
2037 if (children[k]->elementRect().contains(point)) | 2037 if (children[k]->elementRect().contains(point)) |
2038 return children[k].get(); | 2038 return children[k].get(); |
2039 } | 2039 } |
2040 | 2040 |
2041 return 0; | 2041 return 0; |
2042 } | 2042 } |
2043 | 2043 |
2044 bool AXRenderObject::renderObjectIsObservable(RenderObject* renderer) const | 2044 bool AXRenderObject::layoutObjectIsObservable(LayoutObject* renderer) const |
2045 { | 2045 { |
2046 // AX clients will listen for AXValueChange on a text control. | 2046 // AX clients will listen for AXValueChange on a text control. |
2047 if (renderer->isTextControl()) | 2047 if (renderer->isTextControl()) |
2048 return true; | 2048 return true; |
2049 | 2049 |
2050 // AX clients will listen for AXSelectedChildrenChanged on listboxes. | 2050 // AX clients will listen for AXSelectedChildrenChanged on listboxes. |
2051 Node* node = renderer->node(); | 2051 Node* node = renderer->node(); |
2052 if (nodeHasRole(node, "listbox") || (renderer->isBoxModelObject() && toRende
rBoxModelObject(renderer)->isListBox())) | 2052 if (nodeHasRole(node, "listbox") || (renderer->isBoxModelObject() && toRende
rBoxModelObject(renderer)->isListBox())) |
2053 return true; | 2053 return true; |
2054 | 2054 |
2055 // Textboxes should send out notifications. | 2055 // Textboxes should send out notifications. |
2056 if (nodeHasRole(node, "textbox")) | 2056 if (nodeHasRole(node, "textbox")) |
2057 return true; | 2057 return true; |
2058 | 2058 |
2059 return false; | 2059 return false; |
2060 } | 2060 } |
2061 | 2061 |
2062 RenderObject* AXRenderObject::renderParentObject() const | 2062 LayoutObject* AXRenderObject::renderParentObject() const |
2063 { | 2063 { |
2064 if (!m_renderer) | 2064 if (!m_renderer) |
2065 return 0; | 2065 return 0; |
2066 | 2066 |
2067 RenderObject* startOfConts = m_renderer->isRenderBlock() ? startOfContinuati
ons(m_renderer) : 0; | 2067 LayoutObject* startOfConts = m_renderer->isRenderBlock() ? startOfContinuati
ons(m_renderer) : 0; |
2068 if (startOfConts) { | 2068 if (startOfConts) { |
2069 // Case 1: node is a block and is an inline's continuation. Parent | 2069 // Case 1: node is a block and is an inline's continuation. Parent |
2070 // is the start of the continuation chain. | 2070 // is the start of the continuation chain. |
2071 return startOfConts; | 2071 return startOfConts; |
2072 } | 2072 } |
2073 | 2073 |
2074 RenderObject* parent = m_renderer->parent(); | 2074 LayoutObject* parent = m_renderer->parent(); |
2075 startOfConts = parent && parent->isRenderInline() ? startOfContinuations(par
ent) : 0; | 2075 startOfConts = parent && parent->isRenderInline() ? startOfContinuations(par
ent) : 0; |
2076 if (startOfConts) { | 2076 if (startOfConts) { |
2077 // Case 2: node's parent is an inline which is some node's continuation;
parent is | 2077 // Case 2: node's parent is an inline which is some node's continuation;
parent is |
2078 // the earliest node in the continuation chain. | 2078 // the earliest node in the continuation chain. |
2079 return startOfConts; | 2079 return startOfConts; |
2080 } | 2080 } |
2081 | 2081 |
2082 RenderObject* firstChild = parent ? parent->slowFirstChild() : 0; | 2082 LayoutObject* firstChild = parent ? parent->slowFirstChild() : 0; |
2083 if (firstChild && firstChild->node()) { | 2083 if (firstChild && firstChild->node()) { |
2084 // Case 3: The first sibling is the beginning of a continuation chain. F
ind the origin of that continuation. | 2084 // Case 3: The first sibling is the beginning of a continuation chain. F
ind the origin of that continuation. |
2085 // Get the node's renderer and follow that continuation chain until the
first child is found. | 2085 // Get the node's renderer and follow that continuation chain until the
first child is found. |
2086 for (RenderObject* nodeRenderFirstChild = firstChild->node()->renderer()
; nodeRenderFirstChild != firstChild; nodeRenderFirstChild = firstChild->node()-
>renderer()) { | 2086 for (LayoutObject* nodeRenderFirstChild = firstChild->node()->renderer()
; nodeRenderFirstChild != firstChild; nodeRenderFirstChild = firstChild->node()-
>renderer()) { |
2087 for (RenderObject* contsTest = nodeRenderFirstChild; contsTest; cont
sTest = nextContinuation(contsTest)) { | 2087 for (LayoutObject* contsTest = nodeRenderFirstChild; contsTest; cont
sTest = nextContinuation(contsTest)) { |
2088 if (contsTest == firstChild) { | 2088 if (contsTest == firstChild) { |
2089 parent = nodeRenderFirstChild->parent(); | 2089 parent = nodeRenderFirstChild->parent(); |
2090 break; | 2090 break; |
2091 } | 2091 } |
2092 } | 2092 } |
2093 RenderObject* newFirstChild = parent->slowFirstChild(); | 2093 LayoutObject* newFirstChild = parent->slowFirstChild(); |
2094 if (firstChild == newFirstChild) | 2094 if (firstChild == newFirstChild) |
2095 break; | 2095 break; |
2096 firstChild = newFirstChild; | 2096 firstChild = newFirstChild; |
2097 if (!firstChild->node()) | 2097 if (!firstChild->node()) |
2098 break; | 2098 break; |
2099 } | 2099 } |
2100 } | 2100 } |
2101 | 2101 |
2102 return parent; | 2102 return parent; |
2103 } | 2103 } |
2104 | 2104 |
2105 bool AXRenderObject::isDescendantOfElementType(const HTMLQualifiedName& tagName)
const | 2105 bool AXRenderObject::isDescendantOfElementType(const HTMLQualifiedName& tagName)
const |
2106 { | 2106 { |
2107 for (RenderObject* parent = m_renderer->parent(); parent; parent = parent->p
arent()) { | 2107 for (LayoutObject* parent = m_renderer->parent(); parent; parent = parent->p
arent()) { |
2108 if (parent->node() && parent->node()->hasTagName(tagName)) | 2108 if (parent->node() && parent->node()->hasTagName(tagName)) |
2109 return true; | 2109 return true; |
2110 } | 2110 } |
2111 return false; | 2111 return false; |
2112 } | 2112 } |
2113 | 2113 |
2114 bool AXRenderObject::isSVGImage() const | 2114 bool AXRenderObject::isSVGImage() const |
2115 { | 2115 { |
2116 return remoteSVGRootElement(); | 2116 return remoteSVGRootElement(); |
2117 } | 2117 } |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2362 return false; | 2362 return false; |
2363 | 2363 |
2364 if (parent->roleValue() == NoneRole || parent->roleValue() == Presentational
Role) | 2364 if (parent->roleValue() == NoneRole || parent->roleValue() == Presentational
Role) |
2365 return ariaRoleAttribute() == UnknownRole; | 2365 return ariaRoleAttribute() == UnknownRole; |
2366 | 2366 |
2367 return false; | 2367 return false; |
2368 } | 2368 } |
2369 | 2369 |
2370 LayoutRect AXRenderObject::computeElementRect() const | 2370 LayoutRect AXRenderObject::computeElementRect() const |
2371 { | 2371 { |
2372 RenderObject* obj = m_renderer; | 2372 LayoutObject* obj = m_renderer; |
2373 | 2373 |
2374 if (!obj) | 2374 if (!obj) |
2375 return LayoutRect(); | 2375 return LayoutRect(); |
2376 | 2376 |
2377 if (obj->node()) // If we are a continuation, we want to make sure to use th
e primary renderer. | 2377 if (obj->node()) // If we are a continuation, we want to make sure to use th
e primary renderer. |
2378 obj = obj->node()->renderer(); | 2378 obj = obj->node()->renderer(); |
2379 | 2379 |
2380 // absoluteFocusRingBoundingBox will query the hierarchy below this element,
which for large webpages can be very slow. | 2380 // absoluteFocusRingBoundingBox will query the hierarchy below this element,
which for large webpages can be very slow. |
2381 // For a web area, which will have the most elements of any element, absolut
eQuads should be used. | 2381 // For a web area, which will have the most elements of any element, absolut
eQuads should be used. |
2382 // We should also use absoluteQuads for SVG elements, otherwise transforms w
on't be applied. | 2382 // We should also use absoluteQuads for SVG elements, otherwise transforms w
on't be applied. |
(...skipping 28 matching lines...) Expand all Loading... |
2411 if (label && label->renderer()) { | 2411 if (label && label->renderer()) { |
2412 LayoutRect labelRect = axObjectCache()->getOrCreate(label)->elementR
ect(); | 2412 LayoutRect labelRect = axObjectCache()->getOrCreate(label)->elementR
ect(); |
2413 result.unite(labelRect); | 2413 result.unite(labelRect); |
2414 } | 2414 } |
2415 } | 2415 } |
2416 | 2416 |
2417 return result; | 2417 return result; |
2418 } | 2418 } |
2419 | 2419 |
2420 } // namespace blink | 2420 } // namespace blink |
OLD | NEW |