| 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 ENABLE(DIALOG_ELEMENT) | |
| 83 if (toElement(renderer->node())->isInTopLayer()) | 82 if (toElement(renderer->node())->isInTopLayer()) |
| 84 return true; | 83 return true; |
| 85 #endif | |
| 86 return false; | 84 return false; |
| 87 } | 85 } |
| 88 | 86 |
| 89 RenderObject* NodeRenderingContext::nextRenderer() const | 87 RenderObject* NodeRenderingContext::nextRenderer() const |
| 90 { | 88 { |
| 91 if (RenderObject* renderer = m_node->renderer()) | 89 if (RenderObject* renderer = m_node->renderer()) |
| 92 return renderer->nextSibling(); | 90 return renderer->nextSibling(); |
| 93 | 91 |
| 94 #if ENABLE(DIALOG_ELEMENT) | |
| 95 Element* element = m_node->isElementNode() ? toElement(m_node) : 0; | 92 Element* element = m_node->isElementNode() ? toElement(m_node) : 0; |
| 96 if (element && element->isInTopLayer()) { | 93 if (element && element->isInTopLayer()) { |
| 97 const Vector<RefPtr<Element> >& topLayerElements = element->document()->
topLayerElements(); | 94 const Vector<RefPtr<Element> >& topLayerElements = element->document()->
topLayerElements(); |
| 98 size_t position = topLayerElements.find(element); | 95 size_t position = topLayerElements.find(element); |
| 99 ASSERT(position != notFound); | 96 ASSERT(position != notFound); |
| 100 for (size_t i = position + 1; i < topLayerElements.size(); ++i) { | 97 for (size_t i = position + 1; i < topLayerElements.size(); ++i) { |
| 101 if (RenderObject* renderer = topLayerElements[i]->renderer()) | 98 if (RenderObject* renderer = topLayerElements[i]->renderer()) |
| 102 return renderer; | 99 return renderer; |
| 103 } | 100 } |
| 104 return 0; | 101 return 0; |
| 105 } | 102 } |
| 106 #endif | |
| 107 | 103 |
| 108 if (m_parentFlowRenderer) | 104 if (m_parentFlowRenderer) |
| 109 return m_parentFlowRenderer->nextRendererForNode(m_node); | 105 return m_parentFlowRenderer->nextRendererForNode(m_node); |
| 110 | 106 |
| 111 // Avoid an O(N^2) problem with this function by not checking for | 107 // Avoid an O(N^2) problem with this function by not checking for |
| 112 // nextRenderer() when the parent element hasn't attached yet. | 108 // nextRenderer() when the parent element hasn't attached yet. |
| 113 if (m_renderingParent && !m_renderingParent->attached()) | 109 if (m_renderingParent && !m_renderingParent->attached()) |
| 114 return 0; | 110 return 0; |
| 115 | 111 |
| 116 for (Node* sibling = NodeRenderingTraversal::nextSibling(m_node); sibling; s
ibling = NodeRenderingTraversal::nextSibling(sibling)) { | 112 for (Node* sibling = NodeRenderingTraversal::nextSibling(m_node); sibling; s
ibling = NodeRenderingTraversal::nextSibling(sibling)) { |
| 117 RenderObject* renderer = sibling->renderer(); | 113 RenderObject* renderer = sibling->renderer(); |
| 118 if (renderer && !isRendererReparented(renderer)) | 114 if (renderer && !isRendererReparented(renderer)) |
| 119 return renderer; | 115 return renderer; |
| 120 } | 116 } |
| 121 | 117 |
| 122 return 0; | 118 return 0; |
| 123 } | 119 } |
| 124 | 120 |
| 125 RenderObject* NodeRenderingContext::previousRenderer() const | 121 RenderObject* NodeRenderingContext::previousRenderer() const |
| 126 { | 122 { |
| 127 if (RenderObject* renderer = m_node->renderer()) | 123 if (RenderObject* renderer = m_node->renderer()) |
| 128 return renderer->previousSibling(); | 124 return renderer->previousSibling(); |
| 129 | 125 |
| 130 #if ENABLE(DIALOG_ELEMENT) | |
| 131 // FIXME: This doesn't work correctly for things in the top layer that are | 126 // FIXME: This doesn't work correctly for things in the top layer that are |
| 132 // display: none. We'd need to duplicate the logic in nextRenderer, but sinc
e | 127 // display: none. We'd need to duplicate the logic in nextRenderer, but sinc
e |
| 133 // nothing needs that yet just assert. | 128 // nothing needs that yet just assert. |
| 134 ASSERT(!m_node->isElementNode() || !toElement(m_node)->isInTopLayer()); | 129 ASSERT(!m_node->isElementNode() || !toElement(m_node)->isInTopLayer()); |
| 135 #endif | |
| 136 | 130 |
| 137 if (m_parentFlowRenderer) | 131 if (m_parentFlowRenderer) |
| 138 return m_parentFlowRenderer->previousRendererForNode(m_node); | 132 return m_parentFlowRenderer->previousRendererForNode(m_node); |
| 139 | 133 |
| 140 // FIXME: We should have the same O(N^2) avoidance as nextRenderer does | 134 // FIXME: We should have the same O(N^2) avoidance as nextRenderer does |
| 141 // however, when I tried adding it, several tests failed. | 135 // however, when I tried adding it, several tests failed. |
| 142 for (Node* sibling = NodeRenderingTraversal::previousSibling(m_node); siblin
g; sibling = NodeRenderingTraversal::previousSibling(sibling)) { | 136 for (Node* sibling = NodeRenderingTraversal::previousSibling(m_node); siblin
g; sibling = NodeRenderingTraversal::previousSibling(sibling)) { |
| 143 RenderObject* renderer = sibling->renderer(); | 137 RenderObject* renderer = sibling->renderer(); |
| 144 if (renderer && !isRendererReparented(renderer)) | 138 if (renderer && !isRendererReparented(renderer)) |
| 145 return renderer; | 139 return renderer; |
| 146 } | 140 } |
| 147 | 141 |
| 148 return 0; | 142 return 0; |
| 149 } | 143 } |
| 150 | 144 |
| 151 RenderObject* NodeRenderingContext::parentRenderer() const | 145 RenderObject* NodeRenderingContext::parentRenderer() const |
| 152 { | 146 { |
| 153 if (RenderObject* renderer = m_node->renderer()) | 147 if (RenderObject* renderer = m_node->renderer()) |
| 154 return renderer->parent(); | 148 return renderer->parent(); |
| 155 | 149 |
| 156 #if ENABLE(DIALOG_ELEMENT) | |
| 157 if (m_node->isElementNode() && toElement(m_node)->isInTopLayer()) { | 150 if (m_node->isElementNode() && toElement(m_node)->isInTopLayer()) { |
| 158 // The parent renderer of top layer elements is the RenderView, but only | 151 // The parent renderer of top layer elements is the RenderView, but only |
| 159 // if the normal parent would have had a renderer. | 152 // if the normal parent would have had a renderer. |
| 160 // FIXME: This behavior isn't quite right as the spec for top layer | 153 // FIXME: This behavior isn't quite right as the spec for top layer |
| 161 // only talks about display: none ancestors so putting a <dialog> inside | 154 // only talks about display: none ancestors so putting a <dialog> inside |
| 162 // an <optgroup> seems like it should still work even though this check | 155 // an <optgroup> seems like it should still work even though this check |
| 163 // will prevent it. | 156 // will prevent it. |
| 164 if (!m_renderingParent || !m_renderingParent->renderer()) | 157 if (!m_renderingParent || !m_renderingParent->renderer()) |
| 165 return 0; | 158 return 0; |
| 166 return m_node->document()->renderView(); | 159 return m_node->document()->renderView(); |
| 167 } | 160 } |
| 168 #endif | |
| 169 | 161 |
| 170 if (m_parentFlowRenderer) | 162 if (m_parentFlowRenderer) |
| 171 return m_parentFlowRenderer; | 163 return m_parentFlowRenderer; |
| 172 | 164 |
| 173 return m_renderingParent ? m_renderingParent->renderer() : 0; | 165 return m_renderingParent ? m_renderingParent->renderer() : 0; |
| 174 } | 166 } |
| 175 | 167 |
| 176 bool NodeRenderingContext::shouldCreateRenderer() const | 168 bool NodeRenderingContext::shouldCreateRenderer() const |
| 177 { | 169 { |
| 178 if (!m_node->document()->shouldCreateRenderers()) | 170 if (!m_node->document()->shouldCreateRenderers()) |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 314 newRenderer->setFlowThreadState(parentRenderer->flowThreadState()); | 306 newRenderer->setFlowThreadState(parentRenderer->flowThreadState()); |
| 315 | 307 |
| 316 RenderObject* nextRenderer = this->nextRenderer(); | 308 RenderObject* nextRenderer = this->nextRenderer(); |
| 317 textNode->setRenderer(newRenderer); | 309 textNode->setRenderer(newRenderer); |
| 318 // Parent takes care of the animations, no need to call setAnimatableStyle. | 310 // Parent takes care of the animations, no need to call setAnimatableStyle. |
| 319 newRenderer->setStyle(m_style.release()); | 311 newRenderer->setStyle(m_style.release()); |
| 320 parentRenderer->addChild(newRenderer, nextRenderer); | 312 parentRenderer->addChild(newRenderer, nextRenderer); |
| 321 } | 313 } |
| 322 | 314 |
| 323 } | 315 } |
| OLD | NEW |