Index: Source/core/dom/RenderTreeBuilder.h |
diff --git a/Source/core/dom/RenderTreeBuilder.h b/Source/core/dom/RenderTreeBuilder.h |
index dc7a379bd0ffce1d56ec1b5c95f5b3dd4824ea87..0915e6334c8d0c384a8ecca7f5cf05c461f8611b 100644 |
--- a/Source/core/dom/RenderTreeBuilder.h |
+++ b/Source/core/dom/RenderTreeBuilder.h |
@@ -30,34 +30,80 @@ |
#include "core/dom/FirstLetterPseudoElement.h" |
#include "core/dom/Node.h" |
#include "core/dom/NodeRenderingTraversal.h" |
+#include "core/dom/Text.h" |
#include "core/rendering/RenderObject.h" |
#include "wtf/RefPtr.h" |
namespace blink { |
class ContainerNode; |
+class RenderObject; |
class RenderStyle; |
+template <typename NodeType> |
class RenderTreeBuilder { |
STACK_ALLOCATED(); |
+protected: |
+ RenderTreeBuilder(NodeType* node, RenderObject* renderingParent) |
+ : m_node(node) |
+ , m_renderingParent(renderingParent) |
+ { |
+ ASSERT(!node->renderer()); |
+ ASSERT(node->needsAttach()); |
+ ASSERT(node->document().inStyleRecalc()); |
+ |
+ // FIXME: We should be able to ASSERT(node->inActiveDocument()) but childrenChanged is called |
+ // before ChildNodeInsertionNotifier in ContainerNode's methods and some implementations |
+ // will trigger a layout inside childrenChanged. |
+ // Mainly HTMLTextAreaElement::childrenChanged calls HTMLTextFormControlElement::setSelectionRange |
+ // which does an updateLayoutIgnorePendingStylesheets. |
+ } |
+ |
+ RenderObject* parentRenderer() const { return m_renderingParent; } |
+ |
+ RenderObject* nextRenderer() const |
+ { |
+ ASSERT(m_renderingParent); |
+ |
+ // Avoid an O(N^2) walk over the children when reattaching all children of a node. |
+ if (m_renderingParent->node() && m_renderingParent->node()->needsAttach()) |
+ return 0; |
+ |
+ return NodeRenderingTraversal::nextSiblingRenderer(m_node); |
+ } |
+ |
+ RawPtrWillBeMember<NodeType> m_node; |
+ RawPtrWillBeMember<RenderObject> m_renderingParent; |
+}; |
+ |
+class RenderTreeBuilderForElement : public RenderTreeBuilder<Element> { |
public: |
- RenderTreeBuilder(Node*, RenderStyle*); |
+ RenderTreeBuilderForElement(Element*, RenderStyle*); |
- void createRendererForTextIfNeeded(); |
- void createRendererForElementIfNeeded(); |
+ void createRendererIfNeeded() |
+ { |
+ if (shouldCreateRenderer()) |
+ createRenderer(); |
+ } |
private: |
RenderObject* parentRenderer() const; |
RenderObject* nextRenderer() const; |
bool shouldCreateRenderer() const; |
RenderStyle& style() const; |
+ void createRenderer(); |
- RawPtrWillBeMember<Node> m_node; |
- RawPtrWillBeMember<RenderObject> m_renderingParent; |
- NodeRenderingTraversal::ParentDetails m_parentDetails; |
mutable RefPtr<RenderStyle> m_style; |
}; |
+class RenderTreeBuilderForText : public RenderTreeBuilder<Text> { |
+public: |
+ RenderTreeBuilderForText(Text* text, RenderObject* renderingParent) |
+ : RenderTreeBuilder(text, renderingParent) { } |
+ |
+ void createRenderer(); |
+}; |
+ |
} // namespace blink |
#endif |