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

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

Issue 134473008: Remove CSS regions support, keeping a bare minimum to support "region-based" multicol. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebase master Created 6 years, 10 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/RenderTreeBuilder.h ('k') | Source/core/dom/WebKitNamedFlow.idl » ('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 15 matching lines...) Expand all
26 #include "config.h" 26 #include "config.h"
27 #include "core/dom/RenderTreeBuilder.h" 27 #include "core/dom/RenderTreeBuilder.h"
28 28
29 #include "HTMLNames.h" 29 #include "HTMLNames.h"
30 #include "RuntimeEnabledFeatures.h" 30 #include "RuntimeEnabledFeatures.h"
31 #include "SVGNames.h" 31 #include "SVGNames.h"
32 #include "core/css/resolver/StyleResolver.h" 32 #include "core/css/resolver/StyleResolver.h"
33 #include "core/dom/FullscreenElementStack.h" 33 #include "core/dom/FullscreenElementStack.h"
34 #include "core/dom/Node.h" 34 #include "core/dom/Node.h"
35 #include "core/dom/Text.h" 35 #include "core/dom/Text.h"
36 #include "core/rendering/FlowThreadController.h"
37 #include "core/rendering/RenderFullScreen.h" 36 #include "core/rendering/RenderFullScreen.h"
38 #include "core/rendering/RenderNamedFlowThread.h"
39 #include "core/rendering/RenderObject.h" 37 #include "core/rendering/RenderObject.h"
40 #include "core/rendering/RenderText.h" 38 #include "core/rendering/RenderText.h"
41 #include "core/rendering/RenderView.h" 39 #include "core/rendering/RenderView.h"
42 #include "core/svg/SVGElement.h" 40 #include "core/svg/SVGElement.h"
43 41
44 namespace WebCore { 42 namespace WebCore {
45 43
46 RenderObject* RenderTreeBuilder::nextRenderer() const 44 RenderObject* RenderTreeBuilder::nextRenderer() const
47 { 45 {
48 ASSERT(m_renderingParent); 46 ASSERT(m_renderingParent);
49 47
50 Element* element = m_node->isElementNode() ? toElement(m_node) : 0; 48 Element* element = m_node->isElementNode() ? toElement(m_node) : 0;
51 49
52 if (element && element->isInTopLayer()) 50 if (element && element->isInTopLayer())
53 return NodeRenderingTraversal::nextInTopLayer(element); 51 return NodeRenderingTraversal::nextInTopLayer(element);
54 52
55 if (m_parentFlowRenderer)
56 return m_parentFlowRenderer->nextRendererForNode(m_node);
57
58 // Avoid an O(N^2) walk over the children when reattaching all children of a node. 53 // Avoid an O(N^2) walk over the children when reattaching all children of a node.
59 if (m_renderingParent->needsAttach()) 54 if (m_renderingParent->needsAttach())
60 return 0; 55 return 0;
61 56
62 return NodeRenderingTraversal::nextSiblingRenderer(m_node); 57 return NodeRenderingTraversal::nextSiblingRenderer(m_node);
63 } 58 }
64 59
65 RenderObject* RenderTreeBuilder::parentRenderer() const 60 RenderObject* RenderTreeBuilder::parentRenderer() const
66 { 61 {
67 ASSERT(m_renderingParent); 62 ASSERT(m_renderingParent);
68 63
69 Element* element = m_node->isElementNode() ? toElement(m_node) : 0; 64 Element* element = m_node->isElementNode() ? toElement(m_node) : 0;
70 65
71 if (element && m_renderingParent->renderer()) { 66 if (element && m_renderingParent->renderer()) {
72 // FIXME: Guarding this by m_renderingParent->renderer() isn't quite rig ht as the spec for 67 // FIXME: Guarding this by m_renderingParent->renderer() isn't quite rig ht as the spec for
73 // top layer only talks about display: none ancestors so putting a <dial og> inside an 68 // top layer only talks about display: none ancestors so putting a <dial og> inside an
74 // <optgroup> seems like it should still work even though this check wil l prevent it. 69 // <optgroup> seems like it should still work even though this check wil l prevent it.
75 if (element->isInTopLayer()) 70 if (element->isInTopLayer())
76 return m_node->document().renderView(); 71 return m_node->document().renderView();
77 } 72 }
78 73
79 // Even if the normal parent has no renderer we still can be flowed into a n amed flow.
80 // FIXME: This is bad, it breaks the assumption that if you have a renderer then
81 // NodeRenderingTraversal::parent(this) also has one which likely means lots of bugs
82 // with regions.
83 if (m_parentFlowRenderer)
84 return m_parentFlowRenderer;
85
86 return m_renderingParent->renderer(); 74 return m_renderingParent->renderer();
87 } 75 }
88 76
89 bool RenderTreeBuilder::shouldCreateRenderer() const 77 bool RenderTreeBuilder::shouldCreateRenderer() const
90 { 78 {
91 if (!m_renderingParent) 79 if (!m_renderingParent)
92 return false; 80 return false;
93 if (m_node->isSVGElement()) { 81 if (m_node->isSVGElement()) {
94 // SVG elements only render when inside <svg>, or if the element is an < svg> itself. 82 // SVG elements only render when inside <svg>, or if the element is an < svg> itself.
95 if (!m_node->hasTagName(SVGNames::svgTag) && !m_renderingParent->isSVGEl ement()) 83 if (!m_node->hasTagName(SVGNames::svgTag) && !m_renderingParent->isSVGEl ement())
96 return false; 84 return false;
97 if (!toSVGElement(m_node)->isValid()) 85 if (!toSVGElement(m_node)->isValid())
98 return false; 86 return false;
99 } 87 }
100 RenderObject* parentRenderer = this->parentRenderer(); 88 RenderObject* parentRenderer = this->parentRenderer();
101 if (!parentRenderer) 89 if (!parentRenderer)
102 return false; 90 return false;
103 if (!parentRenderer->canHaveChildren()) 91 if (!parentRenderer->canHaveChildren())
104 return false; 92 return false;
105 return true; 93 return true;
106 } 94 }
107 95
108 // Check the specific case of elements that are children of regions but are flow ed into a flow thread themselves.
109 bool RenderTreeBuilder::elementInsideRegionNeedsRenderer()
110 {
111 if (!RuntimeEnabledFeatures::cssRegionsEnabled())
112 return false;
113 Element& element = toElement(*m_node);
114 RenderObject* parentRenderer = this->parentRenderer();
115 if ((parentRenderer && !parentRenderer->canHaveChildren() && parentRenderer- >isRenderNamedFlowFragmentContainer())
116 || (!parentRenderer && element.parentElement() && element.parentElement( )->isInsideRegion())) {
117
118 // Children of this element will only be allowed to be flowed into other flow-threads if display is NOT none.
119 if (element.rendererIsNeeded(style()))
120 element.setIsInsideRegion(true);
121
122 return shouldMoveToFlowThread();
123 }
124
125 return false;
126 }
127
128 bool RenderTreeBuilder::shouldMoveToFlowThread() const
129 {
130 Element& element = toElement(*m_node);
131 RenderStyle& style = this->style();
132
133 if (style.flowThread().isEmpty())
134 return false;
135
136 if (FullscreenElementStack::isActiveFullScreenElement(&element))
137 return false;
138
139 if (element.isInShadowTree())
140 return false;
141
142 // As per http://dev.w3.org/csswg/css3-regions/#flow-into, pseudo-elements s uch as
143 // ::first-line, ::first-letter, ::before or ::after cannot be directly coll ected
144 // into a named flow.
145 if (element.isPseudoElement())
146 return false;
147
148 // Allow only svg root elements to be directly collected by a render flow th read.
149 if (element.isSVGElement()) {
150 if (!element.hasTagName(SVGNames::svgTag))
151 return false;
152 if (!element.parentNode())
153 return false;
154 if (element.parentNode()->isSVGElement())
155 return false;
156 }
157
158 return !element.isRegisteredWithNamedFlow();
159 }
160
161 void RenderTreeBuilder::moveToFlowThreadIfNeeded()
162 {
163 if (!RuntimeEnabledFeatures::cssRegionsEnabled())
164 return;
165
166 if (!shouldMoveToFlowThread())
167 return;
168
169 FlowThreadController* flowThreadController = m_node->document().renderView() ->flowThreadController();
170 m_parentFlowRenderer = flowThreadController->ensureRenderFlowThreadWithName( style().flowThread());
171 flowThreadController->registerNamedFlowContentNode(m_node, m_parentFlowRende rer);
172 }
173
174 RenderStyle& RenderTreeBuilder::style() const 96 RenderStyle& RenderTreeBuilder::style() const
175 { 97 {
176 if (!m_style) 98 if (!m_style)
177 m_style = toElement(m_node)->styleForRenderer(); 99 m_style = toElement(m_node)->styleForRenderer();
178 return *m_style; 100 return *m_style;
179 } 101 }
180 102
181 void RenderTreeBuilder::createRendererForElementIfNeeded() 103 void RenderTreeBuilder::createRendererForElementIfNeeded()
182 { 104 {
183 ASSERT(!m_node->renderer()); 105 ASSERT(!m_node->renderer());
184 106
185 // If we're out of composition then we can't render since there's no parent to inherit from. 107 // If we're out of composition then we can't render since there's no parent to inherit from.
186 if (!m_renderingParent) 108 if (!m_renderingParent)
187 return; 109 return;
188 110
189 Element* element = toElement(m_node); 111 Element* element = toElement(m_node);
190 112
191 if (!shouldCreateRenderer() && !elementInsideRegionNeedsRenderer()) 113 if (!shouldCreateRenderer())
192 return; 114 return;
193 115
194 moveToFlowThreadIfNeeded();
195
196 RenderStyle& style = this->style(); 116 RenderStyle& style = this->style();
197 117
198 if (!element->rendererIsNeeded(style)) 118 if (!element->rendererIsNeeded(style))
199 return; 119 return;
200 120
201 RenderObject* newRenderer = element->createRenderer(&style); 121 RenderObject* newRenderer = element->createRenderer(&style);
202 if (!newRenderer) 122 if (!newRenderer)
203 return; 123 return;
204 124
205 RenderObject* parentRenderer = this->parentRenderer(); 125 RenderObject* parentRenderer = this->parentRenderer();
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
260 newRenderer->setFlowThreadState(parentRenderer->flowThreadState()); 180 newRenderer->setFlowThreadState(parentRenderer->flowThreadState());
261 181
262 RenderObject* nextRenderer = this->nextRenderer(); 182 RenderObject* nextRenderer = this->nextRenderer();
263 textNode->setRenderer(newRenderer); 183 textNode->setRenderer(newRenderer);
264 // Parent takes care of the animations, no need to call setAnimatableStyle. 184 // Parent takes care of the animations, no need to call setAnimatableStyle.
265 newRenderer->setStyle(m_style.release()); 185 newRenderer->setStyle(m_style.release());
266 parentRenderer->addChild(newRenderer, nextRenderer); 186 parentRenderer->addChild(newRenderer, nextRenderer);
267 } 187 }
268 188
269 } 189 }
OLDNEW
« no previous file with comments | « Source/core/dom/RenderTreeBuilder.h ('k') | Source/core/dom/WebKitNamedFlow.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698