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

Side by Side Diff: Source/core/dom/NodeRenderingContext.cpp

Issue 14373010: Make abspos <dialog>'s containing block be the ICB. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: review comments Created 7 years, 7 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) 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
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->shouldBeReparentedUnderRenderView(m_style.get()) && !element->isInTopLayer())
Julien - ping for review 2013/05/09 18:46:58 I misled you here. I was thinking about checking e
falken 2013/05/10 05:50:25 I see now how the code is confusing and probably d
94 return 0;
93 if (element && element->isInTopLayer()) { 95 if (element && element->isInTopLayer()) {
94 const Vector<RefPtr<Element> >& topLayerElements = element->document()-> topLayerElements(); 96 const Vector<RefPtr<Element> >& topLayerElements = element->document()-> topLayerElements();
95 size_t position = topLayerElements.find(element); 97 size_t position = topLayerElements.find(element);
96 ASSERT(position != notFound); 98 ASSERT(position != notFound);
97 for (size_t i = position + 1; i < topLayerElements.size(); ++i) { 99 for (size_t i = position + 1; i < topLayerElements.size(); ++i) {
98 if (RenderObject* renderer = topLayerElements[i]->renderer()) 100 if (RenderObject* renderer = topLayerElements[i]->renderer())
99 return renderer; 101 return renderer;
100 } 102 }
101 return 0; 103 return 0;
102 } 104 }
(...skipping 13 matching lines...) Expand all
116 } 118 }
117 119
118 return 0; 120 return 0;
119 } 121 }
120 122
121 RenderObject* NodeRenderingContext::previousRenderer() const 123 RenderObject* NodeRenderingContext::previousRenderer() const
122 { 124 {
123 if (RenderObject* renderer = m_node->renderer()) 125 if (RenderObject* renderer = m_node->renderer())
124 return renderer->previousSibling(); 126 return renderer->previousSibling();
125 127
126 // FIXME: This doesn't work correctly for things in the top layer that are 128 // 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 129 // display: none. We'd need to duplicate the logic in nextRenderer, but sinc e
128 // nothing needs that yet just assert. 130 // nothing needs that yet just assert.
129 ASSERT(!m_node->isElementNode() || !toElement(m_node)->isInTopLayer()); 131 ASSERT(!m_node->isElementNode() || !toElement(m_node)->shouldBeReparentedUnd erRenderView(m_style.get()));
130 132
131 if (m_parentFlowRenderer) 133 if (m_parentFlowRenderer)
132 return m_parentFlowRenderer->previousRendererForNode(m_node); 134 return m_parentFlowRenderer->previousRendererForNode(m_node);
133 135
134 // FIXME: We should have the same O(N^2) avoidance as nextRenderer does 136 // FIXME: We should have the same O(N^2) avoidance as nextRenderer does
135 // however, when I tried adding it, several tests failed. 137 // however, when I tried adding it, several tests failed.
136 for (Node* sibling = NodeRenderingTraversal::previousSibling(m_node); siblin g; sibling = NodeRenderingTraversal::previousSibling(sibling)) { 138 for (Node* sibling = NodeRenderingTraversal::previousSibling(m_node); siblin g; sibling = NodeRenderingTraversal::previousSibling(sibling)) {
137 RenderObject* renderer = sibling->renderer(); 139 RenderObject* renderer = sibling->renderer();
138 if (renderer && !isRendererReparented(renderer)) 140 if (renderer && !isRendererReparented(renderer))
139 return renderer; 141 return renderer;
140 } 142 }
141 143
142 return 0; 144 return 0;
143 } 145 }
144 146
145 RenderObject* NodeRenderingContext::parentRenderer() const 147 RenderObject* NodeRenderingContext::parentRenderer() const
146 { 148 {
147 if (RenderObject* renderer = m_node->renderer()) 149 if (RenderObject* renderer = m_node->renderer())
148 return renderer->parent(); 150 return renderer->parent();
149 151
150 if (m_node->isElementNode() && toElement(m_node)->isInTopLayer()) { 152 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 153 // The parent renderer of reparented elements is the RenderView, but onl y
152 // if the normal parent would have had a renderer. 154 // if the normal parent would have had a renderer.
153 // FIXME: This behavior isn't quite right as the spec for top layer 155 // 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 156 // only talks about display: none ancestors so putting a <dialog> inside
155 // an <optgroup> seems like it should still work even though this check 157 // an <optgroup> seems like it should still work even though this check
156 // will prevent it. 158 // will prevent it.
157 if (!m_renderingParent || !m_renderingParent->renderer()) 159 if (!m_renderingParent || !m_renderingParent->renderer())
158 return 0; 160 return 0;
159 return m_node->document()->renderView(); 161 return m_node->document()->renderView();
160 } 162 }
161 163
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
306 newRenderer->setFlowThreadState(parentRenderer->flowThreadState()); 308 newRenderer->setFlowThreadState(parentRenderer->flowThreadState());
307 309
308 RenderObject* nextRenderer = this->nextRenderer(); 310 RenderObject* nextRenderer = this->nextRenderer();
309 textNode->setRenderer(newRenderer); 311 textNode->setRenderer(newRenderer);
310 // Parent takes care of the animations, no need to call setAnimatableStyle. 312 // Parent takes care of the animations, no need to call setAnimatableStyle.
311 newRenderer->setStyle(m_style.release()); 313 newRenderer->setStyle(m_style.release());
312 parentRenderer->addChild(newRenderer, nextRenderer); 314 parentRenderer->addChild(newRenderer, nextRenderer);
313 } 315 }
314 316
315 } 317 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698