void NodeRenderingContext::createRendererForTextIfNeeded() { ASSERT(!m_node->renderer()); Text* textNode = toText(m_node); if (!shouldCreateRenderer()) return; RenderObject* parentRenderer = this->parentRenderer(); if (m_parentDetails.resetStyleInheritance()) m_style = textNode->document()->styleResolver()->defaultStyleForElement(); else m_style = parentRenderer->style(); if (!textNode->textRendererIsNeeded(*this)) return; RenderText* newRenderer = textNode->createTextRenderer(m_style.get()); if (!parentRenderer->isChildAllowed(newRenderer, m_style.get())) { 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(parentRenderer->flowThreadState()); RenderObject* nextRenderer = this->nextRenderer(); textNode->setRenderer(newRenderer); // Parent takes care of the animations, no need to call setAnimatableStyle. newRenderer->setStyle(m_style.release()); parentRenderer->addChild(newRenderer, nextRenderer); }
void RenderTreeBuilder::createRendererForTextIfNeeded() { ASSERT(!m_node->renderer()); // If we're out of composition then we can't render since there's no parent to inherit from. if (!m_renderingParent) return; if (!shouldCreateRenderer()) return; Text* textNode = toText(m_node); RenderObject* parentRenderer = this->parentRenderer(); m_style = parentRenderer->style(); if (!textNode->textRendererIsNeeded(*m_style, *parentRenderer)) return; RenderText* newRenderer = textNode->createTextRenderer(m_style.get()); if (!parentRenderer->isChildAllowed(newRenderer, m_style.get())) { 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(parentRenderer->flowThreadState()); RenderObject* nextRenderer = this->nextRenderer(); textNode->setRenderer(newRenderer); // Parent takes care of the animations, no need to call setAnimatableStyle. newRenderer->setStyle(m_style.release()); parentRenderer->addChild(newRenderer, nextRenderer); }
static void createRendererIfNeeded(Element& element, RenderStyle* resolvedStyle) { ASSERT(!element.renderer()); Document& document = element.document(); ContainerNode* renderingParentNode = NodeRenderingTraversal::parent(&element); RefPtr<RenderStyle> style = resolvedStyle; element.setIsInsideRegion(false); if (!shouldCreateRenderer(element, renderingParentNode) && !elementInsideRegionNeedsRenderer(element, renderingParentNode, style)) return; if (!style) style = element.styleForRenderer(); RenderNamedFlowThread* parentFlowRenderer = 0; #if ENABLE(CSS_REGIONS) parentFlowRenderer = moveToFlowThreadIfNeeded(element, *style); #endif if (!element.rendererIsNeeded(*style)) return; RenderObject* parentRenderer; RenderObject* nextRenderer; if (parentFlowRenderer) { parentRenderer = parentFlowRenderer; nextRenderer = parentFlowRenderer->nextRendererForNode(&element); } else { parentRenderer = renderingParentNode->renderer(); nextRenderer = nextSiblingRenderer(element, renderingParentNode); } RenderObject* newRenderer = element.createRenderer(document.renderArena(), style.get()); if (!newRenderer) return; if (!parentRenderer->isChildAllowed(newRenderer, style.get())) { 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(parentRenderer->flowThreadState()); element.setRenderer(newRenderer); newRenderer->setAnimatableStyle(style.release()); // setAnimatableStyle() can depend on renderer() already being set. #if ENABLE(FULLSCREEN_API) if (document.webkitIsFullScreen() && document.webkitCurrentFullScreenElement() == &element) { newRenderer = RenderFullScreen::wrapRenderer(newRenderer, parentRenderer, &document); if (!newRenderer) return; } #endif // Note: Adding newRenderer instead of renderer(). renderer() may be a child of newRenderer. parentRenderer->addChild(newRenderer, nextRenderer); }
void RenderTreeUpdater::createRenderer(Element& element, RenderStyle&& style) { auto computeInsertionPosition = [this, &element, &style] () { #if ENABLE(CSS_REGIONS) if (element.shouldMoveToFlowThread(style)) return RenderTreePosition::insertionPositionForFlowThread(renderTreePosition().parent().element(), element, style); #endif renderTreePosition().computeNextSibling(element); return renderTreePosition(); }; if (!shouldCreateRenderer(element, renderTreePosition().parent())) return; #if ENABLE(CSS_REGIONS) // Even display: none elements need to be registered in FlowThreadController. registerElementForFlowThreadIfNeeded(element, style); #endif if (!element.rendererIsNeeded(style)) return; RenderTreePosition insertionPosition = computeInsertionPosition(); 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); }
void NodeRenderingContext::createRendererForElementIfNeeded() { ASSERT(!m_node->renderer()); Element* element = toElement(m_node); element->setIsInsideRegion(false); if (!shouldCreateRenderer() && !elementInsideRegionNeedsRenderer()) return; if (!m_style) m_style = element->styleForRenderer(); ASSERT(m_style); moveToFlowThreadIfNeeded(); if (!element->rendererIsNeeded(*this)) return; RenderObject* newRenderer = element->createRenderer(m_style.get()); if (!newRenderer) return; RenderObject* parentRenderer = this->parentRenderer(); if (!parentRenderer->isChildAllowed(newRenderer, m_style.get())) { 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(parentRenderer->flowThreadState()); RenderObject* nextRenderer = this->nextRenderer(); element->setRenderer(newRenderer); newRenderer->setAnimatableStyle(m_style.release()); // setAnimatableStyle() can depend on renderer() already being set. if (FullscreenElementStack::isActiveFullScreenElement(element)) { newRenderer = RenderFullScreen::wrapRenderer(newRenderer, parentRenderer, element->document()); if (!newRenderer) return; } // Note: Adding newRenderer instead of renderer(). renderer() may be a child of newRenderer. parentRenderer->addChild(newRenderer, nextRenderer); }
void RenderTreeBuilder::createRendererForElementIfNeeded() { ASSERT(!m_node->renderer()); // If we're out of composition then we can't render since there's no parent to inherit from. if (!m_renderingParent) return; Element* element = toElement(m_node); if (!shouldCreateRenderer()) return; RenderStyle& style = this->style(); if (!element->rendererIsNeeded(style)) return; RenderObject* newRenderer = element->createRenderer(&style); if (!newRenderer) return; RenderObject* parentRenderer = this->parentRenderer(); if (!parentRenderer->isChildAllowed(newRenderer, &style)) { 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(parentRenderer->flowThreadState()); RenderObject* nextRenderer = this->nextRenderer(); element->setRenderer(newRenderer); newRenderer->setStyle(&style); // setStyle() can depend on renderer() already being set. if (FullscreenElementStack::isActiveFullScreenElement(element)) { newRenderer = RenderFullScreen::wrapRenderer(newRenderer, parentRenderer, &element->document()); if (!newRenderer) return; } // Note: Adding newRenderer instead of renderer(). renderer() may be a child of newRenderer. parentRenderer->addChild(newRenderer, nextRenderer); }
void RenderTreeUpdater::updateRenderTree(ContainerNode& root) { ASSERT(root.renderer()); ASSERT(m_parentStack.isEmpty()); m_parentStack.append(Parent(root)); auto descendants = composedTreeDescendants(root); auto it = descendants.begin(); auto end = descendants.end(); // FIXME: https://bugs.webkit.org/show_bug.cgi?id=156172 it.dropAssertions(); while (it != end) { popParentsToDepth(it.depth()); auto& node = *it; if (auto* renderer = node.renderer()) renderTreePosition().invalidateNextSibling(*renderer); if (is<Text>(node)) { auto& text = downcast<Text>(node); if (parent().styleChange == Style::Detach || m_styleUpdate->textUpdate(text) || m_invalidatedWhitespaceOnlyTextSiblings.contains(&text)) updateTextRenderer(text); it.traverseNextSkippingChildren(); continue; } auto& element = downcast<Element>(node); auto* elementUpdate = m_styleUpdate->elementUpdate(element); if (!elementUpdate) { it.traverseNextSkippingChildren(); continue; } updateElementRenderer(element, *elementUpdate); bool mayHaveRenderedDescendants = element.renderer() || (element.hasDisplayContents() && shouldCreateRenderer(element, renderTreePosition().parent())); if (!mayHaveRenderedDescendants) { it.traverseNextSkippingChildren(); continue; } pushParent(element, elementUpdate ? elementUpdate->change : Style::NoChange); it.traverseNext(); } popParentsToDepth(0); m_invalidatedWhitespaceOnlyTextSiblings.clear(); }