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 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 #include "core/svg/graphics/SVGImage.h" | 70 #include "core/svg/graphics/SVGImage.h" |
71 #include "platform/text/PlatformLocale.h" | 71 #include "platform/text/PlatformLocale.h" |
72 #include "wtf/StdLibExtras.h" | 72 #include "wtf/StdLibExtras.h" |
73 | 73 |
74 using blink::WebLocalizedString; | 74 using blink::WebLocalizedString; |
75 | 75 |
76 namespace WebCore { | 76 namespace WebCore { |
77 | 77 |
78 using namespace HTMLNames; | 78 using namespace HTMLNames; |
79 | 79 |
80 static inline RenderObject* firstChildInContinuation(RenderObject* renderer) | 80 static inline RenderObject* firstChildInContinuation(const RenderInline& rendere
r) |
81 { | 81 { |
82 RenderObject* r = toRenderInline(renderer)->continuation(); | 82 RenderBoxModelObject* r = renderer.continuation(); |
83 | 83 |
84 while (r) { | 84 while (r) { |
85 if (r->isRenderBlock()) | 85 if (r->isRenderBlock()) |
86 return r; | 86 return r; |
87 if (RenderObject* child = r->firstChild()) | 87 if (RenderObject* child = r->slowFirstChild()) |
88 return child; | 88 return child; |
89 r = toRenderInline(r)->continuation(); | 89 r = toRenderInline(r)->continuation(); |
90 } | 90 } |
91 | 91 |
92 return 0; | 92 return 0; |
93 } | 93 } |
94 | 94 |
95 static inline bool isInlineWithContinuation(RenderObject* object) | 95 static inline bool isInlineWithContinuation(RenderObject* object) |
96 { | 96 { |
97 if (!object->isBoxModelObject()) | 97 if (!object->isBoxModelObject()) |
98 return false; | 98 return false; |
99 | 99 |
100 RenderBoxModelObject* renderer = toRenderBoxModelObject(object); | 100 RenderBoxModelObject* renderer = toRenderBoxModelObject(object); |
101 if (!renderer->isRenderInline()) | 101 if (!renderer->isRenderInline()) |
102 return false; | 102 return false; |
103 | 103 |
104 return toRenderInline(renderer)->continuation(); | 104 return toRenderInline(renderer)->continuation(); |
105 } | 105 } |
106 | 106 |
107 static inline RenderObject* firstChildConsideringContinuation(RenderObject* rend
erer) | 107 static inline RenderObject* firstChildConsideringContinuation(RenderObject* rend
erer) |
108 { | 108 { |
109 RenderObject* firstChild = renderer->firstChild(); | 109 RenderObject* firstChild = renderer->slowFirstChild(); |
110 | 110 |
111 if (!firstChild && isInlineWithContinuation(renderer)) | 111 if (!firstChild && isInlineWithContinuation(renderer)) |
112 firstChild = firstChildInContinuation(renderer); | 112 firstChild = firstChildInContinuation(toRenderInline(*renderer)); |
113 | 113 |
114 return firstChild; | 114 return firstChild; |
115 } | 115 } |
116 | 116 |
117 static inline RenderInline* startOfContinuations(RenderObject* r) | 117 static inline RenderInline* startOfContinuations(RenderObject* r) |
118 { | 118 { |
119 if (r->isInlineElementContinuation()) { | 119 if (r->isInlineElementContinuation()) { |
120 return toRenderInline(r->node()->renderer()); | 120 return toRenderInline(r->node()->renderer()); |
121 } | 121 } |
122 | 122 |
(...skipping 20 matching lines...) Expand all Loading... |
143 } else { | 143 } else { |
144 cur = toRenderBlock(cur)->inlineElementContinuation(); | 144 cur = toRenderBlock(cur)->inlineElementContinuation(); |
145 } | 145 } |
146 } | 146 } |
147 | 147 |
148 return prev; | 148 return prev; |
149 } | 149 } |
150 | 150 |
151 static inline bool lastChildHasContinuation(RenderObject* renderer) | 151 static inline bool lastChildHasContinuation(RenderObject* renderer) |
152 { | 152 { |
153 return renderer->lastChild() && isInlineWithContinuation(renderer->lastChild
()); | 153 RenderObject* lastChild = renderer->slowLastChild(); |
| 154 return lastChild && isInlineWithContinuation(lastChild); |
154 } | 155 } |
155 | 156 |
156 static RenderBoxModelObject* nextContinuation(RenderObject* renderer) | 157 static RenderBoxModelObject* nextContinuation(RenderObject* renderer) |
157 { | 158 { |
158 ASSERT(renderer); | 159 ASSERT(renderer); |
159 if (renderer->isRenderInline() && !renderer->isReplaced()) | 160 if (renderer->isRenderInline() && !renderer->isReplaced()) |
160 return toRenderInline(renderer)->continuation(); | 161 return toRenderInline(renderer)->continuation(); |
161 if (renderer->isRenderBlock()) | 162 if (renderer->isRenderBlock()) |
162 return toRenderBlock(renderer)->inlineElementContinuation(); | 163 return toRenderBlock(renderer)->inlineElementContinuation(); |
163 return 0; | 164 return 0; |
(...skipping 1210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1374 | 1375 |
1375 RenderObject* nextSibling = 0; | 1376 RenderObject* nextSibling = 0; |
1376 | 1377 |
1377 RenderInline* inlineContinuation; | 1378 RenderInline* inlineContinuation; |
1378 if (m_renderer->isRenderBlock() && (inlineContinuation = toRenderBlock(m_ren
derer)->inlineElementContinuation())) { | 1379 if (m_renderer->isRenderBlock() && (inlineContinuation = toRenderBlock(m_ren
derer)->inlineElementContinuation())) { |
1379 // Case 1: node is a block and has an inline continuation. Next sibling
is the inline continuation's first child. | 1380 // Case 1: node is a block and has an inline continuation. Next sibling
is the inline continuation's first child. |
1380 nextSibling = firstChildConsideringContinuation(inlineContinuation); | 1381 nextSibling = firstChildConsideringContinuation(inlineContinuation); |
1381 } else if (m_renderer->isAnonymousBlock() && lastChildHasContinuation(m_rend
erer)) { | 1382 } else if (m_renderer->isAnonymousBlock() && lastChildHasContinuation(m_rend
erer)) { |
1382 // Case 2: Anonymous block parent of the start of a continuation - skip
all the way to | 1383 // Case 2: Anonymous block parent of the start of a continuation - skip
all the way to |
1383 // after the parent of the end, since everything in between will be link
ed up via the continuation. | 1384 // after the parent of the end, since everything in between will be link
ed up via the continuation. |
1384 RenderObject* lastParent = endOfContinuations(m_renderer->lastChild())->
parent(); | 1385 RenderObject* lastParent = endOfContinuations(toRenderBlock(m_renderer)-
>lastChild())->parent(); |
1385 while (lastChildHasContinuation(lastParent)) | 1386 while (lastChildHasContinuation(lastParent)) |
1386 lastParent = endOfContinuations(lastParent->lastChild())->parent(); | 1387 lastParent = endOfContinuations(lastParent->slowLastChild())->parent
(); |
1387 nextSibling = lastParent->nextSibling(); | 1388 nextSibling = lastParent->nextSibling(); |
1388 } else if (RenderObject* ns = m_renderer->nextSibling()) { | 1389 } else if (RenderObject* ns = m_renderer->nextSibling()) { |
1389 // Case 3: node has an actual next sibling | 1390 // Case 3: node has an actual next sibling |
1390 nextSibling = ns; | 1391 nextSibling = ns; |
1391 } else if (isInlineWithContinuation(m_renderer)) { | 1392 } else if (isInlineWithContinuation(m_renderer)) { |
1392 // Case 4: node is an inline with a continuation. Next sibling is the ne
xt sibling of the end | 1393 // Case 4: node is an inline with a continuation. Next sibling is the ne
xt sibling of the end |
1393 // of the continuation chain. | 1394 // of the continuation chain. |
1394 nextSibling = endOfContinuations(m_renderer)->nextSibling(); | 1395 nextSibling = endOfContinuations(m_renderer)->nextSibling(); |
1395 } else if (isInlineWithContinuation(m_renderer->parent())) { | 1396 } else if (isInlineWithContinuation(m_renderer->parent())) { |
1396 // Case 5: node has no next sibling, and its parent is an inline with a
continuation. | 1397 // Case 5: node has no next sibling, and its parent is an inline with a
continuation. |
(...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1954 RenderObject* startOfConts = 0; | 1955 RenderObject* startOfConts = 0; |
1955 RenderObject* firstChild = 0; | 1956 RenderObject* firstChild = 0; |
1956 if (m_renderer->isRenderBlock() && (startOfConts = startOfContinuations(m_re
nderer))) { | 1957 if (m_renderer->isRenderBlock() && (startOfConts = startOfContinuations(m_re
nderer))) { |
1957 // Case 1: node is a block and is an inline's continuation. Parent | 1958 // Case 1: node is a block and is an inline's continuation. Parent |
1958 // is the start of the continuation chain. | 1959 // is the start of the continuation chain. |
1959 parent = startOfConts; | 1960 parent = startOfConts; |
1960 } else if (parent && parent->isRenderInline() && (startOfConts = startOfCont
inuations(parent))) { | 1961 } else if (parent && parent->isRenderInline() && (startOfConts = startOfCont
inuations(parent))) { |
1961 // Case 2: node's parent is an inline which is some node's continuation;
parent is | 1962 // Case 2: node's parent is an inline which is some node's continuation;
parent is |
1962 // the earliest node in the continuation chain. | 1963 // the earliest node in the continuation chain. |
1963 parent = startOfConts; | 1964 parent = startOfConts; |
1964 } else if (parent && (firstChild = parent->firstChild()) && firstChild->node
()) { | 1965 } else if (parent && (firstChild = parent->slowFirstChild()) && firstChild->
node()) { |
1965 // Case 3: The first sibling is the beginning of a continuation chain. F
ind the origin of that continuation. | 1966 // Case 3: The first sibling is the beginning of a continuation chain. F
ind the origin of that continuation. |
1966 // Get the node's renderer and follow that continuation chain until the
first child is found. | 1967 // Get the node's renderer and follow that continuation chain until the
first child is found. |
1967 RenderObject* nodeRenderFirstChild = firstChild->node()->renderer(); | 1968 RenderObject* nodeRenderFirstChild = firstChild->node()->renderer(); |
1968 while (nodeRenderFirstChild != firstChild) { | 1969 while (nodeRenderFirstChild != firstChild) { |
1969 for (RenderObject* contsTest = nodeRenderFirstChild; contsTest; cont
sTest = nextContinuation(contsTest)) { | 1970 for (RenderObject* contsTest = nodeRenderFirstChild; contsTest; cont
sTest = nextContinuation(contsTest)) { |
1970 if (contsTest == firstChild) { | 1971 if (contsTest == firstChild) { |
1971 parent = nodeRenderFirstChild->parent(); | 1972 parent = nodeRenderFirstChild->parent(); |
1972 break; | 1973 break; |
1973 } | 1974 } |
1974 } | 1975 } |
1975 if (firstChild == parent->firstChild()) | 1976 RenderObject* newFirstChild = parent->slowFirstChild(); |
| 1977 if (firstChild == newFirstChild) |
1976 break; | 1978 break; |
1977 firstChild = parent->firstChild(); | 1979 firstChild = newFirstChild; |
1978 if (!firstChild->node()) | 1980 if (!firstChild->node()) |
1979 break; | 1981 break; |
1980 nodeRenderFirstChild = firstChild->node()->renderer(); | 1982 nodeRenderFirstChild = firstChild->node()->renderer(); |
1981 } | 1983 } |
1982 } | 1984 } |
1983 | 1985 |
1984 return parent; | 1986 return parent; |
1985 } | 1987 } |
1986 | 1988 |
1987 bool AXRenderObject::isDescendantOfElementType(const QualifiedName& tagName) con
st | 1989 bool AXRenderObject::isDescendantOfElementType(const QualifiedName& tagName) con
st |
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2307 if (label && label->renderer()) { | 2309 if (label && label->renderer()) { |
2308 LayoutRect labelRect = axObjectCache()->getOrCreate(label)->elementR
ect(); | 2310 LayoutRect labelRect = axObjectCache()->getOrCreate(label)->elementR
ect(); |
2309 result.unite(labelRect); | 2311 result.unite(labelRect); |
2310 } | 2312 } |
2311 } | 2313 } |
2312 | 2314 |
2313 return result; | 2315 return result; |
2314 } | 2316 } |
2315 | 2317 |
2316 } // namespace WebCore | 2318 } // namespace WebCore |
OLD | NEW |