void RenderTreeUpdater::createRenderer(Element& element, RenderStyle&& style) { if (!shouldCreateRenderer(element, renderTreePosition().parent())) return; RenderNamedFlowThread* parentFlowRenderer = nullptr; #if ENABLE(CSS_REGIONS) parentFlowRenderer = moveToFlowThreadIfNeeded(element, style); #endif if (!element.rendererIsNeeded(style)) return; renderTreePosition().computeNextSibling(element); RenderTreePosition insertionPosition = parentFlowRenderer ? RenderTreePosition(*parentFlowRenderer, parentFlowRenderer->nextRendererForElement(element)) : renderTreePosition(); RenderElement* newRenderer = element.createElementRenderer(WTFMove(style), insertionPosition).leakPtr(); if (!newRenderer) return; if (!insertionPosition.canInsert(*newRenderer)) { newRenderer->destroy(); return; } // Make sure the RenderObject already knows it is going to be added to a RenderFlowThread before we set the style // for the first time. Otherwise code using inRenderFlowThread() in the styleWillChange and styleDidChange will fail. newRenderer->setFlowThreadState(insertionPosition.parent().flowThreadState()); element.setRenderer(newRenderer); auto& initialStyle = newRenderer->style(); std::unique_ptr<RenderStyle> animatedStyle; newRenderer->animation().updateAnimations(*newRenderer, initialStyle, animatedStyle); if (animatedStyle) newRenderer->setStyleInternal(WTFMove(*animatedStyle)); newRenderer->initializeStyle(); #if ENABLE(FULLSCREEN_API) if (m_document.webkitIsFullScreen() && m_document.webkitCurrentFullScreenElement() == &element) { newRenderer = RenderFullScreen::wrapRenderer(newRenderer, &insertionPosition.parent(), m_document); if (!newRenderer) return; } #endif // Note: Adding newRenderer instead of renderer(). renderer() may be a child of newRenderer. insertionPosition.insert(*newRenderer); if (AXObjectCache* cache = m_document.axObjectCache()) cache->updateCacheAfterNodeIsAttached(&element); }
RenderTreeUpdater::Parent::Parent(Element& element, Style::Change styleChange) : element(&element) , styleChange(styleChange) , renderTreePosition(element.renderer() ? std::make_optional(RenderTreePosition(*element.renderer())) : std::nullopt) { }
RenderTreeUpdater::Parent::Parent(ContainerNode& root) : element(is<Document>(root) ? nullptr : downcast<Element>(&root)) , renderTreePosition(RenderTreePosition(*root.renderer())) { }