Chromium Code Reviews| 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 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 182 | 182 |
| 183 bool NodeRenderingContext::shouldCreateRenderer() const | 183 bool NodeRenderingContext::shouldCreateRenderer() const |
| 184 { | 184 { |
| 185 if (!m_node->document()->shouldCreateRenderers()) | 185 if (!m_node->document()->shouldCreateRenderers()) |
| 186 return false; | 186 return false; |
| 187 if (!m_renderingParent) | 187 if (!m_renderingParent) |
| 188 return false; | 188 return false; |
| 189 RenderObject* parentRenderer = this->parentRenderer(); | 189 RenderObject* parentRenderer = this->parentRenderer(); |
| 190 if (!parentRenderer) | 190 if (!parentRenderer) |
| 191 return false; | 191 return false; |
| 192 if (!parentRenderer->canHaveChildren()) | 192 if (!parentRenderer->canHaveChildren()) { |
| 193 return false; | 193 if (parentRenderer->canDOMChildrenHaveRenderParent()) { |
| 194 if (!shouldMoveToFlowThread()) | |
| 195 return false; | |
| 196 } else { | |
| 197 return false; | |
| 198 } | |
| 199 } | |
| 194 if (!m_renderingParent->childShouldCreateRenderer(*this)) | 200 if (!m_renderingParent->childShouldCreateRenderer(*this)) |
| 195 return false; | 201 return false; |
| 196 return true; | 202 return true; |
| 197 } | 203 } |
| 198 | 204 |
| 199 void NodeRenderingContext::moveToFlowThreadIfNeeded() | 205 bool NodeRenderingContext::shouldMoveToFlowThread() const |
| 200 { | 206 { |
| 201 ASSERT(m_node->isElementNode()); | 207 if (!m_node->isElementNode()) |
| 202 ASSERT(m_style); | 208 return false; |
| 209 Element* element = toElement(m_node); | |
| 210 | |
| 203 if (!RuntimeEnabledFeatures::cssRegionsEnabled()) | 211 if (!RuntimeEnabledFeatures::cssRegionsEnabled()) |
| 204 return; | 212 return false; |
| 205 | 213 |
| 206 if (m_style->flowThread().isEmpty()) | 214 if (element && FullscreenController::isActiveFullScreenElement(element)) |
| 207 return; | 215 return false; |
| 216 | |
| 217 if (m_node->isInShadowTree()) | |
| 218 return false; | |
| 208 | 219 |
| 209 // As per http://dev.w3.org/csswg/css3-regions/#flow-into, pseudo-elements s uch as ::first-line, ::first-letter, ::before or ::after | 220 // As per http://dev.w3.org/csswg/css3-regions/#flow-into, pseudo-elements s uch as ::first-line, ::first-letter, ::before or ::after |
| 210 // cannot be directly collected into a named flow. | 221 // cannot be directly collected into a named flow. |
| 211 if (m_node->isPseudoElement()) | 222 if (m_node->isPseudoElement()) |
| 212 return; | 223 return false; |
| 213 | |
| 214 // FIXME: Do not collect elements if they are in shadow tree. | |
| 215 if (m_node->isInShadowTree()) | |
| 216 return; | |
| 217 | |
| 218 if (m_node->isElementNode() && FullscreenController::isActiveFullScreenEleme nt(toElement(m_node))) | |
| 219 return; | |
| 220 | 224 |
| 221 // Allow only svg root elements to be directly collected by a render flow th read. | 225 // Allow only svg root elements to be directly collected by a render flow th read. |
| 222 if (m_node->isSVGElement() | 226 if (m_node->isSVGElement() |
| 223 && (!(m_node->hasTagName(SVGNames::svgTag) && m_node->parentNode() && !m _node->parentNode()->isSVGElement()))) | 227 && (!(m_node->hasTagName(SVGNames::svgTag) && m_node->parentNode() && !m _node->parentNode()->isSVGElement()))) |
| 228 return false; | |
| 229 | |
| 230 if (!m_style) | |
| 231 m_style = element->styleForRenderer(); | |
| 232 if (!m_style) | |
| 233 return false; | |
| 234 | |
| 235 if (m_style->flowThread().isEmpty()) | |
| 236 return false; | |
| 237 | |
| 238 if (m_node->document()->renderView()->flowThreadController()->isContentNodeR egisteredWithAnyNamedFlow(m_node)) | |
| 239 return false; | |
| 240 | |
| 241 return true; | |
| 242 } | |
| 243 | |
| 244 void NodeRenderingContext::moveToFlowThreadIfNeeded() | |
| 245 { | |
| 246 if (!shouldMoveToFlowThread()) | |
| 224 return; | 247 return; |
| 225 | 248 |
| 226 m_flowThread = m_style->flowThread(); | 249 moveToFlowThread(); |
| 250 } | |
| 251 | |
| 252 void NodeRenderingContext::moveToFlowThread() | |
| 253 { | |
| 254 ASSERT(m_node->isElementNode()); | |
| 255 ASSERT(shouldMoveToFlowThread()); | |
| 256 | |
| 227 ASSERT(m_node->document()->renderView()); | 257 ASSERT(m_node->document()->renderView()); |
| 228 FlowThreadController* flowThreadController = m_node->document()->renderView( )->flowThreadController(); | 258 FlowThreadController* flowThreadController = m_node->document()->renderView( )->flowThreadController(); |
| 229 m_parentFlowRenderer = flowThreadController->ensureRenderFlowThreadWithName( m_flowThread); | 259 m_parentFlowRenderer = flowThreadController->ensureRenderFlowThreadWithName( getStyleForRenderer()->flowThread()); |
| 230 flowThreadController->registerNamedFlowContentNode(m_node, m_parentFlowRende rer); | 260 flowThreadController->registerNamedFlowContentNode(m_node, m_parentFlowRende rer); |
| 231 } | 261 } |
| 232 | 262 |
| 263 PassRefPtr<RenderStyle> NodeRenderingContext::getStyleForRenderer() const | |
| 264 { | |
| 265 ASSERT(m_node->isElementNode()); | |
| 266 if (!m_style) | |
| 267 m_style = toElement(m_node)->styleForRenderer(); | |
| 268 ASSERT(m_style); | |
| 269 return m_style; | |
| 270 } | |
| 271 | |
| 233 bool NodeRenderingContext::isOnEncapsulationBoundary() const | 272 bool NodeRenderingContext::isOnEncapsulationBoundary() const |
| 234 { | 273 { |
| 235 return isOnUpperEncapsulationBoundary() || isLowerEncapsulationBoundary(m_pa rentDetails.insertionPoint()) || isLowerEncapsulationBoundary(m_node->parentNode ()); | 274 return isOnUpperEncapsulationBoundary() || isLowerEncapsulationBoundary(m_pa rentDetails.insertionPoint()) || isLowerEncapsulationBoundary(m_node->parentNode ()); |
| 236 } | 275 } |
| 237 | 276 |
| 238 bool NodeRenderingContext::isOnUpperEncapsulationBoundary() const | 277 bool NodeRenderingContext::isOnUpperEncapsulationBoundary() const |
| 239 { | 278 { |
| 240 return m_node->parentNode() && m_node->parentNode()->isShadowRoot(); | 279 return m_node->parentNode() && m_node->parentNode()->isShadowRoot(); |
| 241 } | 280 } |
| 242 | 281 |
| 243 void NodeRenderingContext::createRendererForElementIfNeeded() | 282 void NodeRenderingContext::createRendererForElementIfNeeded() |
| 244 { | 283 { |
| 245 ASSERT(!m_node->renderer()); | 284 ASSERT(!m_node->renderer()); |
| 246 | 285 |
| 286 ASSERT(m_node->isElementNode()); | |
| 247 Element* element = toElement(m_node); | 287 Element* element = toElement(m_node); |
| 248 | 288 |
| 289 // Look for nodes inside a region that are flowed into a 2nd region. | |
| 290 // This avoids doing a style resolution for all nodes. | |
| 291 bool haveTestedForMoveToFlowThread = false; | |
| 292 for (const Element* parentElement = m_node->parentElement(); parentElement; parentElement = parentElement->parentElement()) { | |
|
esprehn
2013/06/17 21:41:02
Woah, this isn't right. This is going to cause per
| |
| 293 if (const RenderObject* rendererParentElement = parentElement->renderer( )) { | |
| 294 if (!rendererParentElement->canHaveChildren() && rendererParentEleme nt->canDOMChildrenHaveRenderParent()) { | |
| 295 moveToFlowThreadIfNeeded(); | |
| 296 haveTestedForMoveToFlowThread = true; | |
| 297 break; | |
| 298 } | |
| 299 } | |
| 300 } | |
| 301 | |
| 249 if (!shouldCreateRenderer()) | 302 if (!shouldCreateRenderer()) |
| 250 return; | 303 return; |
| 251 m_style = element->styleForRenderer(); | |
| 252 ASSERT(m_style); | |
| 253 | 304 |
| 254 moveToFlowThreadIfNeeded(); | 305 // The usual case when elements collected in a flow are not children of a re gion. |
| 306 if (!haveTestedForMoveToFlowThread) | |
| 307 moveToFlowThreadIfNeeded(); | |
| 255 | 308 |
| 309 getStyleForRenderer(); // rendererIsNeeded will call NodeRenderingContext::s tyle() | |
|
esprehn
2013/06/17 21:41:02
Calling a method with a return value and ignoring
maerean
2013/06/17 21:58:45
I have tried using getStyleForRenderer in Element:
| |
| 256 if (!element->rendererIsNeeded(*this)) | 310 if (!element->rendererIsNeeded(*this)) |
| 257 return; | 311 return; |
| 258 | 312 |
| 259 RenderObject* parentRenderer = this->parentRenderer(); | 313 RenderObject* parentRenderer = this->parentRenderer(); |
| 260 RenderObject* nextRenderer = this->nextRenderer(); | 314 RenderObject* nextRenderer = this->nextRenderer(); |
| 261 | 315 |
| 262 Document* document = element->document(); | 316 Document* document = element->document(); |
| 263 RenderObject* newRenderer = element->createRenderer(document->renderArena(), m_style.get()); | 317 RenderObject* newRenderer = element->createRenderer(document->renderArena(), getStyleForRenderer().get()); |
| 264 if (!newRenderer) | 318 if (!newRenderer) |
| 265 return; | 319 return; |
| 266 | 320 |
| 267 if (!parentRenderer->isChildAllowed(newRenderer, m_style.get())) { | 321 if (!parentRenderer->isChildAllowed(newRenderer, m_style.get())) { |
| 268 newRenderer->destroy(); | 322 newRenderer->destroy(); |
| 269 return; | 323 return; |
| 270 } | 324 } |
| 271 | 325 |
| 272 // Make sure the RenderObject already knows it is going to be added to a Ren derFlowThread before we set the style | 326 // Make sure the RenderObject already knows it is going to be added to a Ren derFlowThread before we set the style |
| 273 // for the first time. Otherwise code using inRenderFlowThread() in the styl eWillChange and styleDidChange will fail. | 327 // for the first time. Otherwise code using inRenderFlowThread() in the styl eWillChange and styleDidChange will fail. |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 319 newRenderer->setFlowThreadState(parentRenderer->flowThreadState()); | 373 newRenderer->setFlowThreadState(parentRenderer->flowThreadState()); |
| 320 | 374 |
| 321 RenderObject* nextRenderer = this->nextRenderer(); | 375 RenderObject* nextRenderer = this->nextRenderer(); |
| 322 textNode->setRenderer(newRenderer); | 376 textNode->setRenderer(newRenderer); |
| 323 // Parent takes care of the animations, no need to call setAnimatableStyle. | 377 // Parent takes care of the animations, no need to call setAnimatableStyle. |
| 324 newRenderer->setStyle(m_style.release()); | 378 newRenderer->setStyle(m_style.release()); |
| 325 parentRenderer->addChild(newRenderer, nextRenderer); | 379 parentRenderer->addChild(newRenderer, nextRenderer); |
| 326 } | 380 } |
| 327 | 381 |
| 328 } | 382 } |
| OLD | NEW |