RenderTreeBuilder.h [plain text]
#pragma once
#include "RenderTreePosition.h"
namespace WebCore {
class RenderGrid;
class RenderTreeUpdater;
class RenderTreeBuilder {
public:
RenderTreeBuilder(RenderView&);
~RenderTreeBuilder();
static RenderTreeBuilder* current() { return s_current; }
void attach(RenderTreePosition&, RenderPtr<RenderObject>);
void attach(RenderElement& parent, RenderPtr<RenderObject>, RenderObject* beforeChild = nullptr);
RenderPtr<RenderObject> detach(RenderElement&, RenderObject&) WARN_UNUSED_RETURN;
void destroy(RenderObject& renderer);
enum class NormalizeAfterInsertion { No, Yes };
void move(RenderBoxModelObject& from, RenderBoxModelObject& to, RenderObject& child, NormalizeAfterInsertion);
void updateAfterDescendants(RenderElement&);
void destroyAndCleanUpAnonymousWrappers(RenderObject& child);
void normalizeTreeAfterStyleChange(RenderElement&, RenderStyle& oldStyle);
#if ENABLE(FULLSCREEN_API)
void createPlaceholderForFullScreen(RenderFullScreen&, std::unique_ptr<RenderStyle>, const LayoutRect&);
#endif
private:
void childFlowStateChangesAndAffectsParentBlock(RenderElement& child);
void childFlowStateChangesAndNoLongerAffectsParentBlock(RenderElement& child);
void attachIgnoringContinuation(RenderElement& parent, RenderPtr<RenderObject>, RenderObject* beforeChild = nullptr);
void attachToRenderGrid(RenderGrid& parent, RenderPtr<RenderObject> child, RenderObject* beforeChild = nullptr);
void attachToRenderElement(RenderElement& parent, RenderPtr<RenderObject> child, RenderObject* beforeChild = nullptr);
void attachToRenderElementInternal(RenderElement& parent, RenderPtr<RenderObject> child, RenderObject* beforeChild = nullptr);
RenderPtr<RenderObject> detachFromRenderElement(RenderElement& parent, RenderObject& child) WARN_UNUSED_RETURN;
RenderPtr<RenderObject> detachFromRenderGrid(RenderGrid& parent, RenderObject& child) WARN_UNUSED_RETURN;
void move(RenderBoxModelObject& from, RenderBoxModelObject& to, RenderObject& child, RenderObject* beforeChild, NormalizeAfterInsertion);
void moveChildren(RenderBoxModelObject& from, RenderBoxModelObject& to, RenderObject* startChild, RenderObject* endChild, NormalizeAfterInsertion);
void moveChildren(RenderBoxModelObject& from, RenderBoxModelObject& to, RenderObject* startChild, RenderObject* endChild, RenderObject* beforeChild, NormalizeAfterInsertion);
void moveAllChildrenIncludingFloats(RenderBlock& from, RenderBlock& toBlock, RenderTreeBuilder::NormalizeAfterInsertion);
void moveAllChildren(RenderBoxModelObject& from, RenderBoxModelObject& to, NormalizeAfterInsertion);
void moveAllChildren(RenderBoxModelObject& from, RenderBoxModelObject& to, RenderObject* beforeChild, NormalizeAfterInsertion);
RenderObject* splitAnonymousBoxesAroundChild(RenderBox& parent, RenderObject& originalBeforeChild);
void makeChildrenNonInline(RenderBlock& parent, RenderObject* insertionPoint = nullptr);
void removeAnonymousWrappersForInlineChildrenIfNeeded(RenderElement& parent);
class FirstLetter;
class List;
class MultiColumn;
class Table;
class Ruby;
class FormControls;
class Block;
class BlockFlow;
class Inline;
class SVG;
#if ENABLE(MATHML)
class MathML;
#endif
class Continuation;
#if ENABLE(FULLSCREEN_API)
class FullScreen;
#endif
FirstLetter& firstLetterBuilder() { return *m_firstLetterBuilder; }
List& listBuilder() { return *m_listBuilder; }
MultiColumn& multiColumnBuilder() { return *m_multiColumnBuilder; }
Table& tableBuilder() { return *m_tableBuilder; }
Ruby& rubyBuilder() { return *m_rubyBuilder; }
FormControls& formControlsBuilder() { return *m_formControlsBuilder; }
Block& blockBuilder() { return *m_blockBuilder; }
BlockFlow& blockFlowBuilder() { return *m_blockFlowBuilder; }
Inline& inlineBuilder() { return *m_inlineBuilder; }
SVG& svgBuilder() { return *m_svgBuilder; }
#if ENABLE(MATHML)
MathML& mathMLBuilder() { return *m_mathMLBuilder; }
#endif
Continuation& continuationBuilder() { return *m_continuationBuilder; }
#if ENABLE(FULLSCREEN_API)
FullScreen& fullScreenBuilder() { return *m_fullScreenBuilder; }
#endif
RenderView& m_view;
RenderTreeBuilder* m_previous { nullptr };
static RenderTreeBuilder* s_current;
std::unique_ptr<FirstLetter> m_firstLetterBuilder;
std::unique_ptr<List> m_listBuilder;
std::unique_ptr<MultiColumn> m_multiColumnBuilder;
std::unique_ptr<Table> m_tableBuilder;
std::unique_ptr<Ruby> m_rubyBuilder;
std::unique_ptr<FormControls> m_formControlsBuilder;
std::unique_ptr<Block> m_blockBuilder;
std::unique_ptr<BlockFlow> m_blockFlowBuilder;
std::unique_ptr<Inline> m_inlineBuilder;
std::unique_ptr<SVG> m_svgBuilder;
#if ENABLE(MATHML)
std::unique_ptr<MathML> m_mathMLBuilder;
#endif
std::unique_ptr<Continuation> m_continuationBuilder;
#if ENABLE(FULLSCREEN_API)
std::unique_ptr<FullScreen> m_fullScreenBuilder;
#endif
};
}