| 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
|
|
|