bool layoutObjectContainsPosition(LayoutObject* target, const Position& position)
{
    for (LayoutObject* layoutObject = layoutObjectFromPosition(position); layoutObject && layoutObject->node(); layoutObject = layoutObject->parent()) {
        if (layoutObject == target)
            return true;
    }
    return false;
}
RenderedPosition::RenderedPosition(const VisiblePosition& position)
    : m_layoutObject(nullptr)
    , m_inlineBox(nullptr)
    , m_offset(0)
    , m_prevLeafChild(uncachedInlineBox())
    , m_nextLeafChild(uncachedInlineBox())
{
    if (position.isNull())
        return;
    position.getInlineBoxAndOffset(m_inlineBox, m_offset);
    if (m_inlineBox)
        m_layoutObject = &m_inlineBox->layoutObject();
    else
        m_layoutObject = layoutObjectFromPosition(position.deepEquivalent());
}
RenderedPosition::RenderedPosition(const Position& position, EAffinity affinity)
    : m_layoutObject(nullptr)
    , m_inlineBox(nullptr)
    , m_offset(0)
    , m_prevLeafChild(uncachedInlineBox())
    , m_nextLeafChild(uncachedInlineBox())
{
    if (position.isNull())
        return;
    position.getInlineBoxAndOffset(affinity, m_inlineBox, m_offset);
    if (m_inlineBox)
        m_layoutObject = &m_inlineBox->layoutObject();
    else
        m_layoutObject = layoutObjectFromPosition(position);
}
RenderedPosition::RenderedPosition(const Position& position, TextAffinity affinity)
    : m_layoutObject(nullptr)
    , m_inlineBox(nullptr)
    , m_offset(0)
    , m_prevLeafChild(uncachedInlineBox())
    , m_nextLeafChild(uncachedInlineBox())
{
    if (position.isNull())
        return;
    InlineBoxPosition boxPosition = computeInlineBoxPosition(position, affinity);
    m_inlineBox = boxPosition.inlineBox;
    m_offset = boxPosition.offsetInBox;
    if (m_inlineBox)
        m_layoutObject = &m_inlineBox->layoutObject();
    else
        m_layoutObject = layoutObjectFromPosition(position);
}
RenderedPosition::RenderedPosition(const VisiblePosition& position)
    : m_layoutObject(nullptr)
    , m_inlineBox(nullptr)
    , m_offset(0)
    , m_prevLeafChild(uncachedInlineBox())
    , m_nextLeafChild(uncachedInlineBox())
{
    if (position.isNull())
        return;
    InlineBoxPosition boxPosition = position.computeInlineBoxPosition();
    m_inlineBox = boxPosition.inlineBox;
    m_offset = boxPosition.offsetInBox;
    if (m_inlineBox)
        m_layoutObject = &m_inlineBox->layoutObject();
    else
        m_layoutObject = layoutObjectFromPosition(position.deepEquivalent());
}