[RenderTreeBuilder] Introduce RenderTreebuilder::takeChild
[WebKit-https.git] / Source / WebCore / rendering / updating / RenderTreeBuilder.h
1 /*
2  * Copyright (C) 2017 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #include "RenderTreePosition.h"
29
30 namespace WebCore {
31
32 class RenderMathMLFenced;
33 class RenderRubyAsBlock;
34 class RenderRubyAsInline;
35 class RenderRubyBase;
36 class RenderRubyRun;
37 class RenderSVGContainer;
38 class RenderSVGInline;
39 class RenderSVGRoot;
40 class RenderSVGText;
41 class RenderTable;
42 class RenderTableRow;
43 class RenderTableSection;
44 class RenderTreeUpdater;
45
46 class RenderTreeBuilder {
47 public:
48     RenderTreeBuilder(RenderView&);
49     ~RenderTreeBuilder();
50
51     void insertChild(RenderElement& parent, RenderPtr<RenderObject>, RenderObject* beforeChild = nullptr);
52     void insertChild(RenderTreePosition&, RenderPtr<RenderObject>);
53
54     RenderPtr<RenderObject> takeChild(RenderElement&, RenderObject&) WARN_UNUSED_RETURN;
55
56     void updateAfterDescendants(RenderElement&);
57
58     // This avoids having to convert all sites that need RenderTreeBuilder in one go.
59     // FIXME: Remove.
60     static RenderTreeBuilder* current() { return s_current; }
61
62     // These functions are temporary until after all block/inline/continuation code is moved over.
63     void insertChildToRenderElement(RenderElement& parent, RenderPtr<RenderObject> child, RenderObject* beforeChild = nullptr);
64     void insertChildToRenderBlock(RenderBlock& parent, RenderPtr<RenderObject>, RenderObject* beforeChild = nullptr);
65     void insertChildToRenderBlockIgnoringContinuation(RenderBlock& parent, RenderPtr<RenderObject>, RenderObject* beforeChild = nullptr);
66     void insertChildToRenderBlockFlow(RenderBlockFlow& parent, RenderPtr<RenderObject>, RenderObject* beforeChild = nullptr);
67     void insertChildToRenderInline(RenderInline& parent, RenderPtr<RenderObject>, RenderObject* beforeChild = nullptr);
68     void insertChildToRenderInlineIgnoringContinuation(RenderInline& parent, RenderPtr<RenderObject>, RenderObject* beforeChild = nullptr);
69     void insertChildToSVGContainer(RenderSVGContainer& parent, RenderPtr<RenderObject>, RenderObject* beforeChild = nullptr);
70     void insertChildToSVGInline(RenderSVGInline& parent, RenderPtr<RenderObject>, RenderObject* beforeChild = nullptr);
71     void insertChildToSVGRoot(RenderSVGRoot& parent, RenderPtr<RenderObject>, RenderObject* beforeChild = nullptr);
72     void insertChildToSVGText(RenderSVGText& parent, RenderPtr<RenderObject>, RenderObject* beforeChild = nullptr);
73     void insertChildToRenderTable(RenderTable& parent, RenderPtr<RenderObject> child, RenderObject* beforeChild = nullptr);
74     void insertChildToRenderTableSection(RenderTableSection& parent, RenderPtr<RenderObject> child, RenderObject* beforeChild = nullptr);
75     void insertChildToRenderTableRow(RenderTableRow& parent, RenderPtr<RenderObject> child, RenderObject* beforeChild = nullptr);
76     void insertChildToRenderMathMLFenced(RenderMathMLFenced& parent, RenderPtr<RenderObject> child, RenderObject* beforeChild = nullptr);
77
78     RenderPtr<RenderObject> takeChildFromRenderBlock(RenderBlock& parent, RenderObject& oldChild);
79
80     bool childRequiresTable(const RenderElement& parent, const RenderObject& child);
81     void makeChildrenNonInline(RenderBlock& parent, RenderObject* insertionPoint = nullptr);
82     RenderObject* splitAnonymousBoxesAroundChild(RenderBox& parent, RenderObject* beforeChild);
83     void moveRubyChildren(RenderRubyBase& from, RenderRubyBase& to);
84     void childFlowStateChangesAndAffectsParentBlock(RenderElement& child);
85     void childFlowStateChangesAndNoLongerAffectsParentBlock(RenderElement& child);
86     RenderObject* resolveMovedChildForMultiColumnFlow(RenderFragmentedFlow& enclosingFragmentedFlow, RenderObject* beforeChild);
87     void removeFromParentAndDestroyCleaningUpAnonymousWrappers(RenderObject& child);
88     void multiColumnDescendantInserted(RenderMultiColumnFlow&, RenderObject& newDescendant);
89     void multiColumnRelativeWillBeRemoved(RenderMultiColumnFlow&, RenderObject& relative);
90     void dropAnonymousBoxChild(RenderBlock& parent, RenderBlock& child);
91
92 private:
93     class FirstLetter;
94     class List;
95     class MultiColumn;
96     class Table;
97     class Ruby;
98     class FormControls;
99     class Block;
100     class BlockFlow;
101     class Inline;
102     class SVG;
103     class MathML;
104
105     void removeAnonymousWrappersForInlineChildrenIfNeeded(RenderElement& parent);
106
107     FirstLetter& firstLetterBuilder() { return *m_firstLetterBuilder; }
108     List& listBuilder() { return *m_listBuilder; }
109     MultiColumn& multiColumnBuilder() { return *m_multiColumnBuilder; }
110     Table& tableBuilder() { return *m_tableBuilder; }
111     Ruby& rubyBuilder() { return *m_rubyBuilder; }
112     FormControls& formControlsBuilder() { return *m_formControlsBuilder; }
113     Block& blockBuilder() { return *m_blockBuilder; }
114     BlockFlow& blockFlowBuilder() { return *m_blockFlowBuilder; }
115     Inline& inlineBuilder() { return *m_inlineBuilder; }
116     SVG& svgBuilder() { return *m_svgBuilder; }
117     MathML& mathMLBuilder() { return *m_mathMLBuilder; }
118
119     RenderView& m_view;
120
121     RenderTreeBuilder* m_previous { nullptr };
122     static RenderTreeBuilder* s_current;
123
124     std::unique_ptr<FirstLetter> m_firstLetterBuilder;
125     std::unique_ptr<List> m_listBuilder;
126     std::unique_ptr<MultiColumn> m_multiColumnBuilder;
127     std::unique_ptr<Table> m_tableBuilder;
128     std::unique_ptr<Ruby> m_rubyBuilder;
129     std::unique_ptr<FormControls> m_formControlsBuilder;
130     std::unique_ptr<Block> m_blockBuilder;
131     std::unique_ptr<BlockFlow> m_blockFlowBuilder;
132     std::unique_ptr<Inline> m_inlineBuilder;
133     std::unique_ptr<SVG> m_svgBuilder;
134     std::unique_ptr<MathML> m_mathMLBuilder;
135 };
136
137 }
138