RenderTreeBuilderFormControls.cpp [plain text]
#include "config.h"
#include "RenderTreeBuilderFormControls.h"
#include "RenderButton.h"
#include "RenderMenuList.h"
#include "RenderTreeBuilderBlock.h"
namespace WebCore {
RenderTreeBuilder::FormControls::FormControls(RenderTreeBuilder& builder)
: m_builder(builder)
{
}
void RenderTreeBuilder::FormControls::attach(RenderButton& parent, RenderPtr<RenderObject> child, RenderObject* beforeChild)
{
m_builder.blockBuilder().attach(findOrCreateParentForChild(parent), WTFMove(child), beforeChild);
}
void RenderTreeBuilder::FormControls::attach(RenderMenuList& parent, RenderPtr<RenderObject> child, RenderObject* beforeChild)
{
auto& newChild = *child.get();
m_builder.blockBuilder().attach(findOrCreateParentForChild(parent), WTFMove(child), beforeChild);
parent.didAttachChild(newChild, beforeChild);
}
RenderPtr<RenderObject> RenderTreeBuilder::FormControls::detach(RenderMenuList& parent, RenderObject& child)
{
auto* innerRenderer = parent.innerRenderer();
if (!innerRenderer || &child == innerRenderer)
return m_builder.blockBuilder().detach(parent, child);
return m_builder.detach(*innerRenderer, child);
}
RenderPtr<RenderObject> RenderTreeBuilder::FormControls::detach(RenderButton& parent, RenderObject& child)
{
auto* innerRenderer = parent.innerRenderer();
if (!innerRenderer || &child == innerRenderer || child.parent() == &parent) {
ASSERT(&child == innerRenderer || !innerRenderer);
return m_builder.blockBuilder().detach(parent, child);
}
return m_builder.detach(*innerRenderer, child);
}
RenderBlock& RenderTreeBuilder::FormControls::findOrCreateParentForChild(RenderButton& parent)
{
auto* innerRenderer = parent.innerRenderer();
if (innerRenderer)
return *innerRenderer;
auto wrapper = parent.createAnonymousBlock(parent.style().display());
innerRenderer = wrapper.get();
m_builder.blockBuilder().attach(parent, WTFMove(wrapper), nullptr);
parent.setInnerRenderer(*innerRenderer);
return *innerRenderer;
}
RenderBlock& RenderTreeBuilder::FormControls::findOrCreateParentForChild(RenderMenuList& parent)
{
auto* innerRenderer = parent.innerRenderer();
if (innerRenderer)
return *innerRenderer;
auto wrapper = parent.createAnonymousBlock();
innerRenderer = wrapper.get();
m_builder.blockBuilder().attach(parent, WTFMove(wrapper), nullptr);
parent.setInnerRenderer(*innerRenderer);
return *innerRenderer;
}
}