Exemplo n.º 1
0
void LayoutTreeBuilderForElement::createLayoutObject()
{
    ComputedStyle& style = this->style();

    LayoutObject* newLayoutObject = m_node->createLayoutObject(style);
    if (!newLayoutObject)
        return;

    LayoutObject* parentLayoutObject = this->parentLayoutObject();

    if (!parentLayoutObject->isChildAllowed(newLayoutObject, style)) {
        newLayoutObject->destroy();
        return;
    }

    // Make sure the LayoutObject already knows it is going to be added to a LayoutFlowThread before we set the style
    // for the first time. Otherwise code using inLayoutFlowThread() in the styleWillChange and styleDidChange will fail.
    newLayoutObject->setIsInsideFlowThread(parentLayoutObject->isInsideFlowThread());

    LayoutObject* nextLayoutObject = this->nextLayoutObject();
    m_node->setLayoutObject(newLayoutObject);
    newLayoutObject->setStyle(&style); // setStyle() can depend on layoutObject() already being set.

    if (Fullscreen::isActiveFullScreenElement(*m_node)) {
        newLayoutObject = LayoutFullScreen::wrapLayoutObject(newLayoutObject, parentLayoutObject, &m_node->document());
        if (!newLayoutObject)
            return;
    }

    // Note: Adding newLayoutObject instead of layoutObject(). layoutObject() may be a child of newLayoutObject.
    parentLayoutObject->addChild(newLayoutObject, nextLayoutObject);
}