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

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: Fixed failing test (fullscreen issue), added SVG test 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
« no previous file with comments | « Source/core/dom/NodeRenderingContext.h ('k') | Source/core/dom/PseudoElement.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 // Check the specific case of elements that are children of regions but are flow ed into a flow thread themselves.
189 bool NodeRenderingContext::elementInsideRegionNeedsRenderer()
190 {
191 Element* element = toElement(m_node);
192 bool elementInsideRegionNeedsRenderer = false;
193 RenderObject* parentRenderer = this->parentRenderer();
194 if ((parentRenderer && !parentRenderer->canHaveChildren() && parentRenderer- >isRenderRegion())
195 || (!parentRenderer && element->parentElement() && element->parentElemen t()->isInsideRegion())) {
196
197 if (!m_style)
198 m_style = element->styleForRenderer();
199
200 elementInsideRegionNeedsRenderer = element->shouldMoveToFlowThread(m_sty le.get());
201
202 // Children of this element will only be allowed to be flowed into other flow-threads if display is NOT none.
203 if (element->rendererIsNeeded(*this))
204 element->setIsInsideRegion(true);
205 }
206
207 return elementInsideRegionNeedsRenderer;
208 }
209
187 void NodeRenderingContext::moveToFlowThreadIfNeeded() 210 void NodeRenderingContext::moveToFlowThreadIfNeeded()
188 { 211 {
189 ASSERT(m_node->isElementNode());
190 ASSERT(m_style);
191 if (!RuntimeEnabledFeatures::cssRegionsEnabled()) 212 if (!RuntimeEnabledFeatures::cssRegionsEnabled())
192 return; 213 return;
193 214
194 if (m_style->flowThread().isEmpty()) 215 Element* element = toElement(m_node);
216
217 if (!element->shouldMoveToFlowThread(m_style.get()))
195 return; 218 return;
196 219
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()); 220 ASSERT(m_node->document()->renderView());
216 FlowThreadController* flowThreadController = m_node->document()->renderView( )->flowThreadController(); 221 FlowThreadController* flowThreadController = m_node->document()->renderView( )->flowThreadController();
217 m_parentFlowRenderer = flowThreadController->ensureRenderFlowThreadWithName( m_flowThread); 222 m_parentFlowRenderer = flowThreadController->ensureRenderFlowThreadWithName( m_style->flowThread());
218 flowThreadController->registerNamedFlowContentNode(m_node, m_parentFlowRende rer); 223 flowThreadController->registerNamedFlowContentNode(m_node, m_parentFlowRende rer);
219 } 224 }
220 225
221 bool NodeRenderingContext::isOnEncapsulationBoundary() const 226 bool NodeRenderingContext::isOnEncapsulationBoundary() const
222 { 227 {
223 return isOnUpperEncapsulationBoundary() || isLowerEncapsulationBoundary(m_pa rentDetails.insertionPoint()) || isLowerEncapsulationBoundary(m_node->parentNode ()); 228 return isOnUpperEncapsulationBoundary() || isLowerEncapsulationBoundary(m_pa rentDetails.insertionPoint()) || isLowerEncapsulationBoundary(m_node->parentNode ());
224 } 229 }
225 230
226 bool NodeRenderingContext::isOnUpperEncapsulationBoundary() const 231 bool NodeRenderingContext::isOnUpperEncapsulationBoundary() const
227 { 232 {
228 return m_node->parentNode() && m_node->parentNode()->isShadowRoot(); 233 return m_node->parentNode() && m_node->parentNode()->isShadowRoot();
229 } 234 }
230 235
231 void NodeRenderingContext::createRendererForElementIfNeeded() 236 void NodeRenderingContext::createRendererForElementIfNeeded()
232 { 237 {
233 ASSERT(!m_node->renderer()); 238 ASSERT(!m_node->renderer());
234 239
235 Element* element = toElement(m_node); 240 Element* element = toElement(m_node);
236 241
237 if (!shouldCreateRenderer()) 242 element->setIsInsideRegion(false);
243
244 if (!shouldCreateRenderer() && !elementInsideRegionNeedsRenderer())
238 return; 245 return;
246
239 if (!m_style) 247 if (!m_style)
240 m_style = element->styleForRenderer(); 248 m_style = element->styleForRenderer();
241 ASSERT(m_style); 249 ASSERT(m_style);
242 250
243 moveToFlowThreadIfNeeded(); 251 moveToFlowThreadIfNeeded();
244 252
245 if (!element->rendererIsNeeded(*this)) 253 if (!element->rendererIsNeeded(*this))
246 return; 254 return;
247 255
248 RenderObject* parentRenderer = this->parentRenderer(); 256 RenderObject* parentRenderer = this->parentRenderer();
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
308 newRenderer->setFlowThreadState(parentRenderer->flowThreadState()); 316 newRenderer->setFlowThreadState(parentRenderer->flowThreadState());
309 317
310 RenderObject* nextRenderer = this->nextRenderer(); 318 RenderObject* nextRenderer = this->nextRenderer();
311 textNode->setRenderer(newRenderer); 319 textNode->setRenderer(newRenderer);
312 // Parent takes care of the animations, no need to call setAnimatableStyle. 320 // Parent takes care of the animations, no need to call setAnimatableStyle.
313 newRenderer->setStyle(m_style.release()); 321 newRenderer->setStyle(m_style.release());
314 parentRenderer->addChild(newRenderer, nextRenderer); 322 parentRenderer->addChild(newRenderer, nextRenderer);
315 } 323 }
316 324
317 } 325 }
OLDNEW
« no previous file with comments | « Source/core/dom/NodeRenderingContext.h ('k') | Source/core/dom/PseudoElement.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698