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

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

Issue 153233002: *** DO NOT LAND *** Remove regions support, keeping a bare minimum to support "region-based"... (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: 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) { 50 if (element) {
53 if (element->isInTopLayer()) 51 if (element->isInTopLayer())
54 return NodeRenderingTraversal::nextInTopLayer(element); 52 return NodeRenderingTraversal::nextInTopLayer(element);
55 // FIXME: Reparented dialogs not in the top layer need to be in DOM tree order. 53 // FIXME: Reparented dialogs not in the top layer need to be in DOM tree order.
56 // FIXME: The spec should not require magical behavior for <dialog>. 54 // FIXME: The spec should not require magical behavior for <dialog>.
57 if (element->hasTagName(HTMLNames::dialogTag) && m_style->position() == AbsolutePosition) 55 if (element->hasTagName(HTMLNames::dialogTag) && m_style->position() == AbsolutePosition)
58 return 0; 56 return 0;
59 } 57 }
60 58
61 if (m_parentFlowRenderer)
62 return m_parentFlowRenderer->nextRendererForNode(m_node);
63
64 // Avoid an O(N^2) walk over the children when reattaching all children of a node. 59 // Avoid an O(N^2) walk over the children when reattaching all children of a node.
65 if (m_renderingParent->needsAttach()) 60 if (m_renderingParent->needsAttach())
66 return 0; 61 return 0;
67 62
68 return NodeRenderingTraversal::nextSiblingRenderer(m_node); 63 return NodeRenderingTraversal::nextSiblingRenderer(m_node);
69 } 64 }
70 65
71 RenderObject* RenderTreeBuilder::parentRenderer() const 66 RenderObject* RenderTreeBuilder::parentRenderer() const
72 { 67 {
73 ASSERT(m_renderingParent); 68 ASSERT(m_renderingParent);
74 69
75 Element* element = m_node->isElementNode() ? toElement(m_node) : 0; 70 Element* element = m_node->isElementNode() ? toElement(m_node) : 0;
76 71
77 if (element && m_renderingParent->renderer()) { 72 if (element && m_renderingParent->renderer()) {
78 // FIXME: The spec should not require magical behavior for <dialog>. Not e that the first 73 // FIXME: The spec should not require magical behavior for <dialog>. Not e that the first
79 // time we enter here the m_style might be null because of a call in sho uldCreateRenderer() 74 // time we enter here the m_style might be null because of a call in sho uldCreateRenderer()
80 // which means we return the wrong wrong renderer for that check and the n return a totally 75 // which means we return the wrong wrong renderer for that check and the n return a totally
81 // different renderer (the RenderView) later when this method is called after setting m_style. 76 // different renderer (the RenderView) later when this method is called after setting m_style.
82 if (element->hasTagName(HTMLNames::dialogTag) && m_style && m_style->pos ition() == AbsolutePosition) 77 if (element->hasTagName(HTMLNames::dialogTag) && m_style && m_style->pos ition() == AbsolutePosition)
83 return m_node->document().renderView(); 78 return m_node->document().renderView();
84 79
85 // FIXME: Guarding this by m_renderingParent->renderer() isn't quite rig ht as the spec for 80 // FIXME: Guarding this by m_renderingParent->renderer() isn't quite rig ht as the spec for
86 // top layer only talks about display: none ancestors so putting a <dial og> inside an 81 // top layer only talks about display: none ancestors so putting a <dial og> inside an
87 // <optgroup> seems like it should still work even though this check wil l prevent it. 82 // <optgroup> seems like it should still work even though this check wil l prevent it.
88 if (element->isInTopLayer()) 83 if (element->isInTopLayer())
89 return m_node->document().renderView(); 84 return m_node->document().renderView();
90 } 85 }
91 86
92 // Even if the normal parent has no renderer we still can be flowed into a n amed flow.
93 // FIXME: This is bad, it breaks the assumption that if you have a renderer then
94 // NodeRenderingTraversal::parent(this) also has one which likely means lots of bugs
95 // with regions.
96 if (m_parentFlowRenderer)
97 return m_parentFlowRenderer;
98
99 return m_renderingParent->renderer(); 87 return m_renderingParent->renderer();
100 } 88 }
101 89
102 bool RenderTreeBuilder::shouldCreateRenderer() const 90 bool RenderTreeBuilder::shouldCreateRenderer() const
103 { 91 {
104 if (!m_renderingParent) 92 if (!m_renderingParent)
105 return false; 93 return false;
106 if (m_node->isSVGElement()) { 94 if (m_node->isSVGElement()) {
107 // SVG elements only render when inside <svg>, or if the element is an < svg> itself. 95 // SVG elements only render when inside <svg>, or if the element is an < svg> itself.
108 if (!m_node->hasTagName(SVGNames::svgTag) && !m_renderingParent->isSVGEl ement()) 96 if (!m_node->hasTagName(SVGNames::svgTag) && !m_renderingParent->isSVGEl ement())
109 return false; 97 return false;
110 if (!toSVGElement(m_node)->isValid()) 98 if (!toSVGElement(m_node)->isValid())
111 return false; 99 return false;
112 } 100 }
113 if (m_renderingParent->isSVGElement() && !toSVGElement(m_renderingParent)->c hildShouldCreateRenderer(*m_node)) 101 if (m_renderingParent->isSVGElement() && !toSVGElement(m_renderingParent)->c hildShouldCreateRenderer(*m_node))
114 return false; 102 return false;
115 RenderObject* parentRenderer = this->parentRenderer(); 103 RenderObject* parentRenderer = this->parentRenderer();
116 if (!parentRenderer) 104 if (!parentRenderer)
117 return false; 105 return false;
118 if (!parentRenderer->canHaveChildren()) 106 if (!parentRenderer->canHaveChildren())
119 return false; 107 return false;
120 return true; 108 return true;
121 } 109 }
122 110
123 // Check the specific case of elements that are children of regions but are flow ed into a flow thread themselves.
124 bool RenderTreeBuilder::elementInsideRegionNeedsRenderer()
125 {
126 if (!RuntimeEnabledFeatures::cssRegionsEnabled())
127 return false;
128 Element& element = toElement(*m_node);
129 RenderObject* parentRenderer = this->parentRenderer();
130 if ((parentRenderer && !parentRenderer->canHaveChildren() && parentRenderer- >isRenderNamedFlowFragmentContainer())
131 || (!parentRenderer && element.parentElement() && element.parentElement( )->isInsideRegion())) {
132
133 // Children of this element will only be allowed to be flowed into other flow-threads if display is NOT none.
134 if (element.rendererIsNeeded(style()))
135 element.setIsInsideRegion(true);
136
137 return shouldMoveToFlowThread();
138 }
139
140 return false;
141 }
142
143 bool RenderTreeBuilder::shouldMoveToFlowThread() const
144 {
145 Element& element = toElement(*m_node);
146 RenderStyle& style = this->style();
147
148 if (style.flowThread().isEmpty())
149 return false;
150
151 if (FullscreenElementStack::isActiveFullScreenElement(&element))
152 return false;
153
154 if (element.isInShadowTree())
155 return false;
156
157 // As per http://dev.w3.org/csswg/css3-regions/#flow-into, pseudo-elements s uch as
158 // ::first-line, ::first-letter, ::before or ::after cannot be directly coll ected
159 // into a named flow.
160 if (element.isPseudoElement())
161 return false;
162
163 // Allow only svg root elements to be directly collected by a render flow th read.
164 if (element.isSVGElement()) {
165 if (!element.hasTagName(SVGNames::svgTag))
166 return false;
167 if (!element.parentNode())
168 return false;
169 if (element.parentNode()->isSVGElement())
170 return false;
171 }
172
173 return !element.isRegisteredWithNamedFlow();
174 }
175
176 void RenderTreeBuilder::moveToFlowThreadIfNeeded()
177 {
178 if (!RuntimeEnabledFeatures::cssRegionsEnabled())
179 return;
180
181 if (!shouldMoveToFlowThread())
182 return;
183
184 FlowThreadController* flowThreadController = m_node->document().renderView() ->flowThreadController();
185 m_parentFlowRenderer = flowThreadController->ensureRenderFlowThreadWithName( style().flowThread());
186 flowThreadController->registerNamedFlowContentNode(m_node, m_parentFlowRende rer);
187 }
188
189 RenderStyle& RenderTreeBuilder::style() const 111 RenderStyle& RenderTreeBuilder::style() const
190 { 112 {
191 if (!m_style) 113 if (!m_style)
192 m_style = toElement(m_node)->styleForRenderer(); 114 m_style = toElement(m_node)->styleForRenderer();
193 return *m_style; 115 return *m_style;
194 } 116 }
195 117
196 void RenderTreeBuilder::createRendererForElementIfNeeded() 118 void RenderTreeBuilder::createRendererForElementIfNeeded()
197 { 119 {
198 ASSERT(!m_node->renderer()); 120 ASSERT(!m_node->renderer());
199 121
200 // If we're out of composition then we can't render since there's no parent to inherit from. 122 // If we're out of composition then we can't render since there's no parent to inherit from.
201 if (!m_renderingParent) 123 if (!m_renderingParent)
202 return; 124 return;
203 125
204 Element* element = toElement(m_node); 126 Element* element = toElement(m_node);
205 127
206 if (!shouldCreateRenderer() && !elementInsideRegionNeedsRenderer()) 128 if (!shouldCreateRenderer())
207 return; 129 return;
208 130
209 moveToFlowThreadIfNeeded();
210
211 RenderStyle& style = this->style(); 131 RenderStyle& style = this->style();
212 132
213 if (!element->rendererIsNeeded(style)) 133 if (!element->rendererIsNeeded(style))
214 return; 134 return;
215 135
216 RenderObject* newRenderer = element->createRenderer(&style); 136 RenderObject* newRenderer = element->createRenderer(&style);
217 if (!newRenderer) 137 if (!newRenderer)
218 return; 138 return;
219 139
220 RenderObject* parentRenderer = this->parentRenderer(); 140 RenderObject* parentRenderer = this->parentRenderer();
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
275 newRenderer->setFlowThreadState(parentRenderer->flowThreadState()); 195 newRenderer->setFlowThreadState(parentRenderer->flowThreadState());
276 196
277 RenderObject* nextRenderer = this->nextRenderer(); 197 RenderObject* nextRenderer = this->nextRenderer();
278 textNode->setRenderer(newRenderer); 198 textNode->setRenderer(newRenderer);
279 // Parent takes care of the animations, no need to call setAnimatableStyle. 199 // Parent takes care of the animations, no need to call setAnimatableStyle.
280 newRenderer->setStyle(m_style.release()); 200 newRenderer->setStyle(m_style.release());
281 parentRenderer->addChild(newRenderer, nextRenderer); 201 parentRenderer->addChild(newRenderer, nextRenderer);
282 } 202 }
283 203
284 } 204 }
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