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

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

Issue 18080016: [CSS Regions] Elements in a region should be assignable to a named flow (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Implemented suggestions from esprehn Created 7 years, 5 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
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 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 if (m_parentFlowRenderer) 167 if (m_parentFlowRenderer)
168 return m_parentFlowRenderer; 168 return m_parentFlowRenderer;
169 169
170 return m_renderingParent ? m_renderingParent->renderer() : 0; 170 return m_renderingParent ? m_renderingParent->renderer() : 0;
171 } 171 }
172 172
173 bool NodeRenderingContext::shouldCreateRenderer() const 173 bool NodeRenderingContext::shouldCreateRenderer() const
174 { 174 {
175 if (!m_renderingParent) 175 if (!m_renderingParent)
176 return false; 176 return false;
177
177 RenderObject* parentRenderer = this->parentRenderer(); 178 RenderObject* parentRenderer = this->parentRenderer();
178 if (!parentRenderer) 179 if (!parentRenderer)
179 return false; 180 return false;
180 if (!parentRenderer->canHaveChildren()) 181 if (!parentRenderer->canHaveChildren())
181 return false; 182 return false;
182 if (!m_renderingParent->childShouldCreateRenderer(*this)) 183 if (!m_renderingParent->childShouldCreateRenderer(*this))
183 return false; 184 return false;
184 return true; 185 return true;
185 } 186 }
186 187
188 bool NodeRenderingContext::elementInsideRegionNeedsRenderer()
189 {
190 Element* element = toElement(m_node);
191 bool elementInsideRegionNeedsRenderer = false;
192 RenderObject* parentRenderer = this->parentRenderer();
193 if ((parentRenderer && !parentRenderer->canHaveChildren() && parentRenderer- >isRenderRegion())
194 || (!parentRenderer && element->parentElement() && element->parentElemen t()->isInsideRegion())) {
195
196 if (!m_style)
197 m_style = element->styleForRenderer();
198
199 elementInsideRegionNeedsRenderer = element->shouldMoveToFlowThread(m_sty le.get());
200
201 // Children of this element will only be allowed to be flowed into other flow-threads if display is NOT none.
202 if (element->rendererIsNeeded(*this))
203 element->setIsInsideRegion(true);
204 }
205
206 return elementInsideRegionNeedsRenderer;
207 }
208
187 void NodeRenderingContext::moveToFlowThreadIfNeeded() 209 void NodeRenderingContext::moveToFlowThreadIfNeeded()
188 { 210 {
189 ASSERT(m_node->isElementNode());
190 ASSERT(m_style);
191 if (!RuntimeEnabledFeatures::cssRegionsEnabled()) 211 if (!RuntimeEnabledFeatures::cssRegionsEnabled())
192 return; 212 return;
193 213
194 if (m_style->flowThread().isEmpty()) 214 Element* element = toElement(m_node);
215
216 if (!element->shouldMoveToFlowThread(m_style.get()))
195 return; 217 return;
196 218
197 // As per http://dev.w3.org/csswg/css3-regions/#flow-into, pseudo-elements s uch as ::first-line, ::first-letter, ::before or ::after
198 // cannot be directly collected into a named flow.
199 if (m_node->isPseudoElement())
200 return;
201
202 // FIXME: Do not collect elements if they are in shadow tree.
203 if (m_node->isInShadowTree())
204 return;
205
206 if (m_node->isElementNode() && FullscreenController::isActiveFullScreenEleme nt(toElement(m_node)))
207 return;
208
209 // Allow only svg root elements to be directly collected by a render flow th read.
210 if (m_node->isSVGElement()
211 && (!(m_node->hasTagName(SVGNames::svgTag) && m_node->parentNode() && !m _node->parentNode()->isSVGElement())))
212 return;
213
214 m_flowThread = m_style->flowThread();
215 ASSERT(m_node->document()->renderView()); 219 ASSERT(m_node->document()->renderView());
216 FlowThreadController* flowThreadController = m_node->document()->renderView( )->flowThreadController(); 220 FlowThreadController* flowThreadController = m_node->document()->renderView( )->flowThreadController();
217 m_parentFlowRenderer = flowThreadController->ensureRenderFlowThreadWithName( m_flowThread); 221 m_parentFlowRenderer = flowThreadController->ensureRenderFlowThreadWithName( m_style->flowThread());
218 flowThreadController->registerNamedFlowContentNode(m_node, m_parentFlowRende rer); 222 flowThreadController->registerNamedFlowContentNode(m_node, m_parentFlowRende rer);
219 } 223 }
220 224
221 bool NodeRenderingContext::isOnEncapsulationBoundary() const 225 bool NodeRenderingContext::isOnEncapsulationBoundary() const
222 { 226 {
223 return isOnUpperEncapsulationBoundary() || isLowerEncapsulationBoundary(m_pa rentDetails.insertionPoint()) || isLowerEncapsulationBoundary(m_node->parentNode ()); 227 return isOnUpperEncapsulationBoundary() || isLowerEncapsulationBoundary(m_pa rentDetails.insertionPoint()) || isLowerEncapsulationBoundary(m_node->parentNode ());
224 } 228 }
225 229
226 bool NodeRenderingContext::isOnUpperEncapsulationBoundary() const 230 bool NodeRenderingContext::isOnUpperEncapsulationBoundary() const
227 { 231 {
228 return m_node->parentNode() && m_node->parentNode()->isShadowRoot(); 232 return m_node->parentNode() && m_node->parentNode()->isShadowRoot();
229 } 233 }
230 234
231 void NodeRenderingContext::createRendererForElementIfNeeded() 235 void NodeRenderingContext::createRendererForElementIfNeeded()
232 { 236 {
233 ASSERT(!m_node->renderer()); 237 ASSERT(!m_node->renderer());
234 238
235 Element* element = toElement(m_node); 239 Element* element = toElement(m_node);
236 240
237 if (!shouldCreateRenderer()) 241 element->setIsInsideRegion(false);
esprehn 2013/07/01 18:27:19 You need to do this inside Node::detach too. Other
238 return; 242
243 if (!shouldCreateRenderer()) {
244 // Check the specific case of elements that are children of regions but are flowed into a flow thread themselves.
245 if (!elementInsideRegionNeedsRenderer())
246 return;
esprehn 2013/07/01 18:27:19 if (!shouldCreateRenderer() && !elementInsideRegio
247 }
248
239 if (!m_style) 249 if (!m_style)
240 m_style = element->styleForRenderer(); 250 m_style = element->styleForRenderer();
241 ASSERT(m_style); 251 ASSERT(m_style);
242 252
243 moveToFlowThreadIfNeeded(); 253 moveToFlowThreadIfNeeded();
244 254
245 if (!element->rendererIsNeeded(*this)) 255 if (!element->rendererIsNeeded(*this))
246 return; 256 return;
247 257
248 RenderObject* parentRenderer = this->parentRenderer(); 258 RenderObject* parentRenderer = this->parentRenderer();
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
308 newRenderer->setFlowThreadState(parentRenderer->flowThreadState()); 318 newRenderer->setFlowThreadState(parentRenderer->flowThreadState());
309 319
310 RenderObject* nextRenderer = this->nextRenderer(); 320 RenderObject* nextRenderer = this->nextRenderer();
311 textNode->setRenderer(newRenderer); 321 textNode->setRenderer(newRenderer);
312 // Parent takes care of the animations, no need to call setAnimatableStyle. 322 // Parent takes care of the animations, no need to call setAnimatableStyle.
313 newRenderer->setStyle(m_style.release()); 323 newRenderer->setStyle(m_style.release());
314 parentRenderer->addChild(newRenderer, nextRenderer); 324 parentRenderer->addChild(newRenderer, nextRenderer);
315 } 325 }
316 326
317 } 327 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698