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

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: 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 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 if (!parentRenderer->canHaveChildren()) 180 if (!parentRenderer->canHaveChildren())
181 return false; 181 return false;
182 if (!m_renderingParent->childShouldCreateRenderer(*this)) 182 if (!m_renderingParent->childShouldCreateRenderer(*this))
183 return false; 183 return false;
184 return true; 184 return true;
185 } 185 }
186 186
187 void NodeRenderingContext::moveToFlowThreadIfNeeded() 187 void NodeRenderingContext::moveToFlowThreadIfNeeded()
188 { 188 {
189 ASSERT(m_node->isElementNode()); 189 ASSERT(m_node->isElementNode());
190 ASSERT(m_style); 190 Element* element = toElement(m_node);
esprehn 2013/06/28 20:29:36 You don't need the ASSERT( before this since toEle
191
191 if (!RuntimeEnabledFeatures::cssRegionsEnabled()) 192 if (!RuntimeEnabledFeatures::cssRegionsEnabled())
192 return; 193 return;
193 194
194 if (m_style->flowThread().isEmpty()) 195 if (!m_style)
196 m_style = element->styleForRenderer();
197
198 if (!element->shouldMoveToFlowThread(m_style.get()))
195 return; 199 return;
196 200
197 // As per http://dev.w3.org/csswg/css3-regions/#flow-into, pseudo-elements s uch as ::first-line, ::first-letter, ::before or ::after 201 moveToFlowThread();
198 // cannot be directly collected into a named flow. 202 }
199 if (m_node->isPseudoElement())
200 return;
201 203
202 // FIXME: Do not collect elements if they are in shadow tree. 204 void NodeRenderingContext::moveToFlowThread()
esprehn 2013/06/28 20:29:36 Why is this a separate method now? Lets just merge
203 if (m_node->isInShadowTree()) 205 {
204 return; 206 ASSERT(m_node->isElementNode());
207 Element* element = toElement(m_node);
205 208
206 if (m_node->isElementNode() && FullscreenController::isActiveFullScreenEleme nt(toElement(m_node))) 209 if (!m_style)
207 return; 210 m_style = element->styleForRenderer();
208 211 ASSERT(m_style);
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()); 212 ASSERT(m_node->document()->renderView());
213 ASSERT(element->shouldMoveToFlowThread(m_style.get()));
216 FlowThreadController* flowThreadController = m_node->document()->renderView( )->flowThreadController(); 214 FlowThreadController* flowThreadController = m_node->document()->renderView( )->flowThreadController();
217 m_parentFlowRenderer = flowThreadController->ensureRenderFlowThreadWithName( m_flowThread); 215 m_parentFlowRenderer = flowThreadController->ensureRenderFlowThreadWithName( m_style->flowThread());
218 flowThreadController->registerNamedFlowContentNode(m_node, m_parentFlowRende rer); 216 flowThreadController->registerNamedFlowContentNode(m_node, m_parentFlowRende rer);
219 } 217 }
220 218
221 bool NodeRenderingContext::isOnEncapsulationBoundary() const 219 bool NodeRenderingContext::isOnEncapsulationBoundary() const
222 { 220 {
223 return isOnUpperEncapsulationBoundary() || isLowerEncapsulationBoundary(m_pa rentDetails.insertionPoint()) || isLowerEncapsulationBoundary(m_node->parentNode ()); 221 return isOnUpperEncapsulationBoundary() || isLowerEncapsulationBoundary(m_pa rentDetails.insertionPoint()) || isLowerEncapsulationBoundary(m_node->parentNode ());
224 } 222 }
225 223
226 bool NodeRenderingContext::isOnUpperEncapsulationBoundary() const 224 bool NodeRenderingContext::isOnUpperEncapsulationBoundary() const
227 { 225 {
228 return m_node->parentNode() && m_node->parentNode()->isShadowRoot(); 226 return m_node->parentNode() && m_node->parentNode()->isShadowRoot();
229 } 227 }
230 228
231 void NodeRenderingContext::createRendererForElementIfNeeded() 229 void NodeRenderingContext::createRendererForElementIfNeeded()
232 { 230 {
233 ASSERT(!m_node->renderer()); 231 ASSERT(!m_node->renderer());
234 232
235 Element* element = toElement(m_node); 233 Element* element = toElement(m_node);
236 234
237 if (!shouldCreateRenderer()) 235 if (!shouldCreateRenderer()) {
238 return; 236 // Check the specific case of elements that are children of regions but are flowed into a flow thread themselves.
esprehn 2013/06/28 20:29:36 This whole check should be in a method.
237 bool shouldBeInNamedFlow = false;
238 RenderObject* parentRenderer = this->parentRenderer();
239 if ((parentRenderer && !parentRenderer->canHaveChildren() && parentRende rer->isRenderRegion())
240 || (!parentRenderer && element->parentElement() && element->parentEl ement()->isDOMChildOfRegion())) {
241 if (!m_style)
242 m_style = element->styleForRenderer();
esprehn 2013/06/28 20:29:36 This doesn't seem right, We should put if (!m_sty
243
244 shouldBeInNamedFlow = element && element->shouldMoveToFlowThread(m_s tyle.get());
esprehn 2013/06/28 20:29:36 element can't be null, you don't need element &&
245
246 // Children of this element will only be allowed to be flowed into o ther flow-threads if display is NOT none.
247 if (element->rendererIsNeeded(*this))
248 element->setIsDOMChildOfRegion(true);
esprehn 2013/06/28 20:29:36 You never reset this to false so if I remove a chi
249 }
250
251 if (!shouldBeInNamedFlow)
252 return;
253 }
254
239 if (!m_style) 255 if (!m_style)
240 m_style = element->styleForRenderer(); 256 m_style = element->styleForRenderer();
241 ASSERT(m_style); 257 ASSERT(m_style);
242 258
243 moveToFlowThreadIfNeeded(); 259 moveToFlowThreadIfNeeded();
244 260
245 if (!element->rendererIsNeeded(*this)) 261 if (!element->rendererIsNeeded(*this))
246 return; 262 return;
247 263
248 RenderObject* parentRenderer = this->parentRenderer(); 264 RenderObject* parentRenderer = this->parentRenderer();
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
308 newRenderer->setFlowThreadState(parentRenderer->flowThreadState()); 324 newRenderer->setFlowThreadState(parentRenderer->flowThreadState());
309 325
310 RenderObject* nextRenderer = this->nextRenderer(); 326 RenderObject* nextRenderer = this->nextRenderer();
311 textNode->setRenderer(newRenderer); 327 textNode->setRenderer(newRenderer);
312 // Parent takes care of the animations, no need to call setAnimatableStyle. 328 // Parent takes care of the animations, no need to call setAnimatableStyle.
313 newRenderer->setStyle(m_style.release()); 329 newRenderer->setStyle(m_style.release());
314 parentRenderer->addChild(newRenderer, nextRenderer); 330 parentRenderer->addChild(newRenderer, nextRenderer);
315 } 331 }
316 332
317 } 333 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698