OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * (C) 2001 Dirk Mueller (mueller@kde.org) | 4 * (C) 2001 Dirk Mueller (mueller@kde.org) |
5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r
ights reserved. | 5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r
ights reserved. |
6 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) | 6 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) |
7 * Copyright (C) 2011 Google Inc. All rights reserved. | 7 * Copyright (C) 2011 Google Inc. All rights reserved. |
8 * | 8 * |
9 * This library is free software; you can redistribute it and/or | 9 * This library is free software; you can redistribute it and/or |
10 * modify it under the terms of the GNU Library General Public | 10 * modify it under the terms of the GNU Library General Public |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
72 NodeRenderingContext::~NodeRenderingContext() | 72 NodeRenderingContext::~NodeRenderingContext() |
73 { | 73 { |
74 } | 74 } |
75 | 75 |
76 static bool isRendererReparented(const RenderObject* renderer) | 76 static bool isRendererReparented(const RenderObject* renderer) |
77 { | 77 { |
78 if (!renderer->node()->isElementNode()) | 78 if (!renderer->node()->isElementNode()) |
79 return false; | 79 return false; |
80 if (renderer->style() && !renderer->style()->flowThread().isEmpty()) | 80 if (renderer->style() && !renderer->style()->flowThread().isEmpty()) |
81 return true; | 81 return true; |
82 if (toElement(renderer->node())->isInTopLayer()) | 82 if (toElement(renderer->node())->shouldBeReparentedUnderRenderView(renderer-
>style())) |
83 return true; | 83 return true; |
84 return false; | 84 return false; |
85 } | 85 } |
86 | 86 |
87 RenderObject* NodeRenderingContext::nextRenderer() const | 87 RenderObject* NodeRenderingContext::nextRenderer() const |
88 { | 88 { |
89 if (RenderObject* renderer = m_node->renderer()) | 89 if (RenderObject* renderer = m_node->renderer()) |
90 return renderer->nextSibling(); | 90 return renderer->nextSibling(); |
91 | 91 |
92 Element* element = m_node->isElementNode() ? toElement(m_node) : 0; | 92 Element* element = m_node->isElementNode() ? toElement(m_node) : 0; |
93 if (element && element->isInTopLayer()) { | 93 if (element && element->shouldBeReparentedUnderRenderView(m_style.get())) { |
| 94 // FIXME: Reparented renderers not in the top layer should probably be |
| 95 // ordered in DOM tree order. We don't have a good way to do that yet, |
| 96 // since NodeRenderingTraversal isn't aware of reparenting. It's safe to |
| 97 // just append for now; it doesn't disrupt the top layer rendering as |
| 98 // the layer collection in RenderLayer only requires that top layer |
| 99 // renderers are orderered correctly relative to each other. |
| 100 if (!element->isInTopLayer()) |
| 101 return 0; |
| 102 |
94 const Vector<RefPtr<Element> >& topLayerElements = element->document()->
topLayerElements(); | 103 const Vector<RefPtr<Element> >& topLayerElements = element->document()->
topLayerElements(); |
95 size_t position = topLayerElements.find(element); | 104 size_t position = topLayerElements.find(element); |
96 ASSERT(position != notFound); | 105 ASSERT(position != notFound); |
97 for (size_t i = position + 1; i < topLayerElements.size(); ++i) { | 106 for (size_t i = position + 1; i < topLayerElements.size(); ++i) { |
98 if (RenderObject* renderer = topLayerElements[i]->renderer()) | 107 if (RenderObject* renderer = topLayerElements[i]->renderer()) |
99 return renderer; | 108 return renderer; |
100 } | 109 } |
101 return 0; | 110 return 0; |
102 } | 111 } |
103 | 112 |
(...skipping 12 matching lines...) Expand all Loading... |
116 } | 125 } |
117 | 126 |
118 return 0; | 127 return 0; |
119 } | 128 } |
120 | 129 |
121 RenderObject* NodeRenderingContext::previousRenderer() const | 130 RenderObject* NodeRenderingContext::previousRenderer() const |
122 { | 131 { |
123 if (RenderObject* renderer = m_node->renderer()) | 132 if (RenderObject* renderer = m_node->renderer()) |
124 return renderer->previousSibling(); | 133 return renderer->previousSibling(); |
125 | 134 |
126 // FIXME: This doesn't work correctly for things in the top layer that are | 135 // FIXME: This doesn't work correctly for reparented elements that are |
127 // display: none. We'd need to duplicate the logic in nextRenderer, but sinc
e | 136 // display: none. We'd need to duplicate the logic in nextRenderer, but sinc
e |
128 // nothing needs that yet just assert. | 137 // nothing needs that yet just assert. |
129 ASSERT(!m_node->isElementNode() || !toElement(m_node)->isInTopLayer()); | 138 ASSERT(!m_node->isElementNode() || !toElement(m_node)->shouldBeReparentedUnd
erRenderView(m_style.get())); |
130 | 139 |
131 if (m_parentFlowRenderer) | 140 if (m_parentFlowRenderer) |
132 return m_parentFlowRenderer->previousRendererForNode(m_node); | 141 return m_parentFlowRenderer->previousRendererForNode(m_node); |
133 | 142 |
134 // FIXME: We should have the same O(N^2) avoidance as nextRenderer does | 143 // FIXME: We should have the same O(N^2) avoidance as nextRenderer does |
135 // however, when I tried adding it, several tests failed. | 144 // however, when I tried adding it, several tests failed. |
136 for (Node* sibling = NodeRenderingTraversal::previousSibling(m_node); siblin
g; sibling = NodeRenderingTraversal::previousSibling(sibling)) { | 145 for (Node* sibling = NodeRenderingTraversal::previousSibling(m_node); siblin
g; sibling = NodeRenderingTraversal::previousSibling(sibling)) { |
137 RenderObject* renderer = sibling->renderer(); | 146 RenderObject* renderer = sibling->renderer(); |
138 if (renderer && !isRendererReparented(renderer)) | 147 if (renderer && !isRendererReparented(renderer)) |
139 return renderer; | 148 return renderer; |
140 } | 149 } |
141 | 150 |
142 return 0; | 151 return 0; |
143 } | 152 } |
144 | 153 |
145 RenderObject* NodeRenderingContext::parentRenderer() const | 154 RenderObject* NodeRenderingContext::parentRenderer() const |
146 { | 155 { |
147 if (RenderObject* renderer = m_node->renderer()) | 156 if (RenderObject* renderer = m_node->renderer()) |
148 return renderer->parent(); | 157 return renderer->parent(); |
149 | 158 |
150 if (m_node->isElementNode() && toElement(m_node)->isInTopLayer()) { | 159 if (m_node->isElementNode() && toElement(m_node)->shouldBeReparentedUnderRen
derView(m_style.get())) { |
151 // The parent renderer of top layer elements is the RenderView, but only | 160 // The parent renderer of reparented elements is the RenderView, but onl
y |
152 // if the normal parent would have had a renderer. | 161 // if the normal parent would have had a renderer. |
153 // FIXME: This behavior isn't quite right as the spec for top layer | 162 // FIXME: This behavior isn't quite right as the spec for top layer |
154 // only talks about display: none ancestors so putting a <dialog> inside | 163 // only talks about display: none ancestors so putting a <dialog> inside |
155 // an <optgroup> seems like it should still work even though this check | 164 // an <optgroup> seems like it should still work even though this check |
156 // will prevent it. | 165 // will prevent it. |
157 if (!m_renderingParent || !m_renderingParent->renderer()) | 166 if (!m_renderingParent || !m_renderingParent->renderer()) |
158 return 0; | 167 return 0; |
159 return m_node->document()->renderView(); | 168 return m_node->document()->renderView(); |
160 } | 169 } |
161 | 170 |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
306 newRenderer->setFlowThreadState(parentRenderer->flowThreadState()); | 315 newRenderer->setFlowThreadState(parentRenderer->flowThreadState()); |
307 | 316 |
308 RenderObject* nextRenderer = this->nextRenderer(); | 317 RenderObject* nextRenderer = this->nextRenderer(); |
309 textNode->setRenderer(newRenderer); | 318 textNode->setRenderer(newRenderer); |
310 // Parent takes care of the animations, no need to call setAnimatableStyle. | 319 // Parent takes care of the animations, no need to call setAnimatableStyle. |
311 newRenderer->setStyle(m_style.release()); | 320 newRenderer->setStyle(m_style.release()); |
312 parentRenderer->addChild(newRenderer, nextRenderer); | 321 parentRenderer->addChild(newRenderer, nextRenderer); |
313 } | 322 } |
314 | 323 |
315 } | 324 } |
OLD | NEW |