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

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

Issue 699213003: RenderTreeBuilder => RenderTreeBuilderForElement and RenderTreeBuilderForText (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 1 month 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 | Annotate | Revision Log
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 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 52
53 // 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.
54 if (m_renderingParent->needsAttach()) 54 if (m_renderingParent->needsAttach())
55 return 0; 55 return 0;
56 56
57 return NodeRenderingTraversal::nextSiblingRenderer(m_node); 57 return NodeRenderingTraversal::nextSiblingRenderer(m_node);
58 } 58 }
59 59
60 RenderObject* RenderTreeBuilder::parentRenderer() const 60 RenderObject* RenderTreeBuilder::parentRenderer() const
61 { 61 {
62 ASSERT(m_renderingParent);
63
64 Element* element = m_node->isElementNode() ? toElement(m_node) : 0;
65
66 if (element && m_renderingParent->renderer()) {
67 // FIXME: Guarding this by m_renderingParent->renderer() isn't quite rig ht as the spec for
68 // top layer only talks about display: none ancestors so putting a <dial og> inside an
69 // <optgroup> seems like it should still work even though this check wil l prevent it.
70 if (element->isInTopLayer())
71 return m_node->document().renderView();
72 }
73
74 return m_renderingParent->renderer(); 62 return m_renderingParent->renderer();
75 } 63 }
76 64
77 bool RenderTreeBuilder::shouldCreateRenderer() const 65 bool RenderTreeBuilder::rendererIsNeeded() const
78 { 66 {
79 if (!m_renderingParent) 67 if (!m_renderingParent)
80 return false; 68 return false;
69 RenderObject* parentRenderer = this->parentRenderer();
70 if (!parentRenderer)
71 return false;
72 if (!parentRenderer->canHaveChildren())
73 return false;
74 return true;
75 }
76
77 void RenderTreeBuilder::createRendererIfNeeded()
78 {
79 ASSERT(!m_node->renderer());
80
81 if (rendererIsNeeded())
82 createRenderer();
83 }
84
85 bool RenderTreeBuilderForElement::rendererIsNeeded() const
86 {
87 if (!RenderTreeBuilder::rendererIsNeeded())
88 return false;
89
90 ASSERT(m_renderingParent);
91
92 // FIXME: Should the following be in SVGElement::rendererIsNeeded()?
81 if (m_node->isSVGElement()) { 93 if (m_node->isSVGElement()) {
82 // SVG elements only render when inside <svg>, or if the element is an < svg> itself. 94 // SVG elements only render when inside <svg>, or if the element is an < svg> itself.
83 if (!isSVGSVGElement(*m_node) && !m_renderingParent->isSVGElement()) 95 if (!isSVGSVGElement(*m_node) && !m_renderingParent->isSVGElement())
84 return false; 96 return false;
85 if (!toSVGElement(m_node)->isValid()) 97 if (!toSVGElement(m_node)->isValid())
86 return false; 98 return false;
87 } 99 }
88 RenderObject* parentRenderer = this->parentRenderer(); 100
89 if (!parentRenderer) 101 return toElement(m_node)->rendererIsNeeded(*m_style.get());
90 return false;
91 if (!parentRenderer->canHaveChildren())
92 return false;
93 return true;
94 } 102 }
95 103
96 RenderStyle& RenderTreeBuilder::style() const 104 RenderObject* RenderTreeBuilderForElement::parentRenderer() const
97 { 105 {
98 if (!m_style) 106 ASSERT(m_renderingParent);
99 m_style = toElement(m_node)->styleForRenderer(); 107
100 return *m_style; 108 if (m_renderingParent->renderer()) {
109 // FIXME: Guarding this by m_renderingParent->renderer() isn't quite rig ht as the spec for
110 // top layer only talks about display: none ancestors so putting a <dial og> inside an
111 // <optgroup> seems like it should still work even though this check wil l prevent it.
112 if (toElement(m_node)->isInTopLayer())
113 return m_node->document().renderView();
114 }
115
116 return RenderTreeBuilder::parentRenderer();
101 } 117 }
102 118
103 void RenderTreeBuilder::createRendererForElementIfNeeded() 119 void RenderTreeBuilderForElement::createRenderer()
104 { 120 {
121 ASSERT(rendererIsNeeded());
105 ASSERT(!m_node->renderer()); 122 ASSERT(!m_node->renderer());
106 123
107 if (!shouldCreateRenderer())
108 return;
109
110 Element* element = toElement(m_node); 124 Element* element = toElement(m_node);
111 RenderStyle& style = this->style(); 125 RenderStyle& style = *m_style.get();
112
113 if (!element->rendererIsNeeded(style))
114 return;
115 126
116 RenderObject* newRenderer = element->createRenderer(&style); 127 RenderObject* newRenderer = element->createRenderer(&style);
117 if (!newRenderer) 128 if (!newRenderer)
118 return; 129 return;
119 130
120 RenderObject* parentRenderer = this->parentRenderer(); 131 RenderObject* parentRenderer = this->parentRenderer();
121 132
122 if (!parentRenderer->isChildAllowed(newRenderer, &style)) { 133 if (!parentRenderer->isChildAllowed(newRenderer, &style)) {
123 newRenderer->destroy(); 134 newRenderer->destroy();
124 return; 135 return;
(...skipping 10 matching lines...) Expand all
135 if (Fullscreen::isActiveFullScreenElement(*element)) { 146 if (Fullscreen::isActiveFullScreenElement(*element)) {
136 newRenderer = RenderFullScreen::wrapRenderer(newRenderer, parentRenderer , &element->document()); 147 newRenderer = RenderFullScreen::wrapRenderer(newRenderer, parentRenderer , &element->document());
137 if (!newRenderer) 148 if (!newRenderer)
138 return; 149 return;
139 } 150 }
140 151
141 // Note: Adding newRenderer instead of renderer(). renderer() may be a child of newRenderer. 152 // Note: Adding newRenderer instead of renderer(). renderer() may be a child of newRenderer.
142 parentRenderer->addChild(newRenderer, nextRenderer); 153 parentRenderer->addChild(newRenderer, nextRenderer);
143 } 154 }
144 155
145 void RenderTreeBuilder::createRendererForTextIfNeeded() 156 bool RenderTreeBuilderForText::rendererIsNeeded() const
146 { 157 {
158 if (!RenderTreeBuilder::rendererIsNeeded())
159 return false;
160
161 return toText(m_node)->textRendererIsNeeded(*parentRenderer()->style(), *par entRenderer());
162 }
163
164 void RenderTreeBuilderForText::createRenderer()
165 {
166 ASSERT(rendererIsNeeded());
147 ASSERT(!m_node->renderer()); 167 ASSERT(!m_node->renderer());
148 168
149 if (!shouldCreateRenderer())
150 return;
151
152 Text* textNode = toText(m_node); 169 Text* textNode = toText(m_node);
153 RenderObject* parentRenderer = this->parentRenderer(); 170 RenderObject* parentRenderer = this->parentRenderer();
171 RenderStyle* style = parentRenderer->style();
154 172
155 m_style = parentRenderer->style(); 173 RenderText* newRenderer = textNode->createTextRenderer(style);
156 174 if (!parentRenderer->isChildAllowed(newRenderer, style)) {
157 if (!textNode->textRendererIsNeeded(*m_style, *parentRenderer))
158 return;
159
160 RenderText* newRenderer = textNode->createTextRenderer(m_style.get());
161 if (!parentRenderer->isChildAllowed(newRenderer, m_style.get())) {
162 newRenderer->destroy(); 175 newRenderer->destroy();
163 return; 176 return;
164 } 177 }
165 178
166 // Make sure the RenderObject already knows it is going to be added to a Ren derFlowThread before we set the style 179 // Make sure the RenderObject already knows it is going to be added to a Ren derFlowThread before we set the style
167 // for the first time. Otherwise code using inRenderFlowThread() in the styl eWillChange and styleDidChange will fail. 180 // for the first time. Otherwise code using inRenderFlowThread() in the styl eWillChange and styleDidChange will fail.
168 newRenderer->setFlowThreadState(parentRenderer->flowThreadState()); 181 newRenderer->setFlowThreadState(parentRenderer->flowThreadState());
169 182
170 RenderObject* nextRenderer = this->nextRenderer(); 183 RenderObject* nextRenderer = this->nextRenderer();
171 textNode->setRenderer(newRenderer); 184 textNode->setRenderer(newRenderer);
172 // Parent takes care of the animations, no need to call setAnimatableStyle. 185 // Parent takes care of the animations, no need to call setAnimatableStyle.
173 newRenderer->setStyle(m_style.release()); 186 newRenderer->setStyle(style);
174 parentRenderer->addChild(newRenderer, nextRenderer); 187 parentRenderer->addChild(newRenderer, nextRenderer);
175 } 188 }
176 189
177 } 190 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698