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); }
void PseudoElement::attach(const AttachContext& context) { ASSERT(!layoutObject()); Element::attach(context); LayoutObject* renderer = this->layoutObject(); if (!renderer) return; ComputedStyle& style = renderer->mutableStyleRef(); if (style.styleType() != BEFORE && style.styleType() != AFTER) return; ASSERT(style.contentData()); for (const ContentData* content = style.contentData(); content; content = content->next()) { LayoutObject* child = content->createLayoutObject(document(), style); if (renderer->isChildAllowed(child, style)) { renderer->addChild(child); if (child->isQuote()) toLayoutQuote(child)->attachQuote(); } else child->destroy(); } }
void PseudoElement::attachLayoutTree(const AttachContext& context) { DCHECK(!layoutObject()); Element::attachLayoutTree(context); LayoutObject* layoutObject = this->layoutObject(); if (!layoutObject) return; ComputedStyle& style = layoutObject->mutableStyleRef(); if (style.styleType() != PseudoIdBefore && style.styleType() != PseudoIdAfter) return; DCHECK(style.contentData()); for (const ContentData* content = style.contentData(); content; content = content->next()) { LayoutObject* child = content->createLayoutObject(document(), style); if (layoutObject->isChildAllowed(child, style)) { layoutObject->addChild(child); if (child->isQuote()) toLayoutQuote(child)->attachQuote(); } else { child->destroy(); } } }