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

Side by Side Diff: Source/core/accessibility/AccessibilityRenderObject.cpp

Issue 16361013: Get rid of extraneous accessibility tree traversal code. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebase for reland Created 7 years, 6 months 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 | Annotate | Revision Log
OLDNEW
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 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 static inline RenderObject* firstChildConsideringContinuation(RenderObject* rend erer) 104 static inline RenderObject* firstChildConsideringContinuation(RenderObject* rend erer)
105 { 105 {
106 RenderObject* firstChild = renderer->firstChild(); 106 RenderObject* firstChild = renderer->firstChild();
107 107
108 if (!firstChild && isInlineWithContinuation(renderer)) 108 if (!firstChild && isInlineWithContinuation(renderer))
109 firstChild = firstChildInContinuation(renderer); 109 firstChild = firstChildInContinuation(renderer);
110 110
111 return firstChild; 111 return firstChild;
112 } 112 }
113 113
114
115 static inline RenderObject* lastChildConsideringContinuation(RenderObject* rende rer)
116 {
117 RenderObject* lastChild = renderer->lastChild();
118 RenderObject* prev;
119 RenderObject* cur = renderer;
120
121 if (!cur->isRenderInline() && !cur->isRenderBlock())
122 return renderer;
123
124 while (cur) {
125 prev = cur;
126
127 if (RenderObject* lc = cur->lastChild())
128 lastChild = lc;
129
130 if (cur->isRenderInline()) {
131 cur = toRenderInline(cur)->inlineElementContinuation();
132 ASSERT_UNUSED(prev, cur || !toRenderInline(prev)->continuation());
133 } else
134 cur = toRenderBlock(cur)->inlineElementContinuation();
135 }
136
137 return lastChild;
138 }
139
140 static inline RenderInline* startOfContinuations(RenderObject* r) 114 static inline RenderInline* startOfContinuations(RenderObject* r)
141 { 115 {
142 if (r->isInlineElementContinuation()) { 116 if (r->isInlineElementContinuation()) {
143 return toRenderInline(r->node()->renderer()); 117 return toRenderInline(r->node()->renderer());
144 } 118 }
145 119
146 // Blocks with a previous continuation always have a next continuation 120 // Blocks with a previous continuation always have a next continuation
147 if (r->isRenderBlock() && toRenderBlock(r)->inlineElementContinuation()) 121 if (r->isRenderBlock() && toRenderBlock(r)->inlineElementContinuation())
148 return toRenderInline(toRenderBlock(r)->inlineElementContinuation()->nod e()->renderer()); 122 return toRenderInline(toRenderBlock(r)->inlineElementContinuation()->nod e()->renderer());
149 123
(...skipping 1377 matching lines...) Expand 10 before | Expand all | Expand 10 after
1527 return 0; 1501 return 0;
1528 1502
1529 RenderObject* firstChild = firstChildConsideringContinuation(m_renderer); 1503 RenderObject* firstChild = firstChildConsideringContinuation(m_renderer);
1530 1504
1531 if (!firstChild) 1505 if (!firstChild)
1532 return 0; 1506 return 0;
1533 1507
1534 return axObjectCache()->getOrCreate(firstChild); 1508 return axObjectCache()->getOrCreate(firstChild);
1535 } 1509 }
1536 1510
1537 AccessibilityObject* AccessibilityRenderObject::lastChild() const
1538 {
1539 if (!m_renderer)
1540 return 0;
1541
1542 RenderObject* lastChild = lastChildConsideringContinuation(m_renderer);
1543
1544 if (!lastChild)
1545 return 0;
1546
1547 return axObjectCache()->getOrCreate(lastChild);
1548 }
1549
1550 AccessibilityObject* AccessibilityRenderObject::previousSibling() const
1551 {
1552 if (!m_renderer)
1553 return 0;
1554
1555 RenderObject* previousSibling = 0;
1556
1557 // Case 1: The node is a block and is an inline's continuation. In that case , the inline's
1558 // last child is our previous sibling (or further back in the continuation c hain)
1559 RenderInline* startOfConts;
1560 if (m_renderer->isRenderBlock() && (startOfConts = startOfContinuations(m_re nderer)))
1561 previousSibling = childBeforeConsideringContinuations(startOfConts, m_re nderer);
1562
1563 // Case 2: Anonymous block parent of the end of a continuation - skip all th e way to before
1564 // the parent of the start, since everything in between will be linked up vi a the continuation.
1565 else if (m_renderer->isAnonymousBlock() && firstChildIsInlineContinuation(m_ renderer)) {
1566 RenderObject* firstParent = startOfContinuations(m_renderer->firstChild( ))->parent();
1567 while (firstChildIsInlineContinuation(firstParent))
1568 firstParent = startOfContinuations(firstParent->firstChild())->paren t();
1569 previousSibling = firstParent->previousSibling();
1570 }
1571
1572 // Case 3: The node has an actual previous sibling
1573 else if (RenderObject* ps = m_renderer->previousSibling())
1574 previousSibling = ps;
1575
1576 // Case 4: This node has no previous siblings, but its parent is an inline,
1577 // and is another node's inline continutation. Follow the continuation chain .
1578 else if (m_renderer->parent()->isRenderInline() && (startOfConts = startOfCo ntinuations(m_renderer->parent())))
1579 previousSibling = childBeforeConsideringContinuations(startOfConts, m_re nderer->parent()->firstChild());
1580
1581 if (!previousSibling)
1582 return 0;
1583
1584 return axObjectCache()->getOrCreate(previousSibling);
1585 }
1586
1587 AccessibilityObject* AccessibilityRenderObject::nextSibling() const 1511 AccessibilityObject* AccessibilityRenderObject::nextSibling() const
1588 { 1512 {
1589 if (!m_renderer) 1513 if (!m_renderer)
1590 return 0; 1514 return 0;
1591 1515
1592 RenderObject* nextSibling = 0; 1516 RenderObject* nextSibling = 0;
1593 1517
1594 // Case 1: node is a block and has an inline continuation. Next sibling is t he inline continuation's 1518 // Case 1: node is a block and has an inline continuation. Next sibling is t he inline continuation's
1595 // first child. 1519 // first child.
1596 RenderInline* inlineContinuation; 1520 RenderInline* inlineContinuation;
(...skipping 1083 matching lines...) Expand 10 before | Expand all | Expand 10 after
2680 if (label && label->renderer()) { 2604 if (label && label->renderer()) {
2681 LayoutRect labelRect = axObjectCache()->getOrCreate(label)->elementR ect(); 2605 LayoutRect labelRect = axObjectCache()->getOrCreate(label)->elementR ect();
2682 result.unite(labelRect); 2606 result.unite(labelRect);
2683 } 2607 }
2684 } 2608 }
2685 2609
2686 return result; 2610 return result;
2687 } 2611 }
2688 2612
2689 } // namespace WebCore 2613 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/accessibility/AccessibilityRenderObject.h ('k') | public/webpage/WebAccessibilityObject.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698