void RenderNamedFlowFragment::computeChildrenStyleInRegion(RenderElement& renderer) { for (auto& child : childrenOfType<RenderObject>(renderer)) { auto it = m_renderObjectRegionStyle.find(&child); std::unique_ptr<RenderStyle> childStyleInRegion; bool objectRegionStyleCached = false; if (it != m_renderObjectRegionStyle.end()) { childStyleInRegion = RenderStyle::clonePtr(*it->value.style); objectRegionStyleCached = true; } else { if (child.isAnonymous() || child.isInFlowRenderFlowThread()) childStyleInRegion = std::make_unique<RenderStyle>(RenderStyle::createAnonymousStyleWithDisplay(renderer.style(), child.style().display())); else if (is<RenderText>(child)) childStyleInRegion = RenderStyle::clonePtr(renderer.style()); else childStyleInRegion = computeStyleInRegion(downcast<RenderElement>(child), renderer.style()); } setObjectStyleInRegion(&child, WTFMove(childStyleInRegion), objectRegionStyleCached); if (is<RenderElement>(child)) computeChildrenStyleInRegion(downcast<RenderElement>(child)); } }
void RenderRegion::computeChildrenStyleInRegion(const RenderObject* object) { for (RenderObject* child = object->firstChild(); child; child = child->nextSibling()) { RenderObjectRegionStyleMap::iterator it = m_renderObjectRegionStyle.find(child); RefPtr<RenderStyle> childStyleInRegion; bool objectRegionStyleCached = false; if (it != m_renderObjectRegionStyle.end()) { childStyleInRegion = it->value.style; objectRegionStyleCached = true; } else { if (child->isAnonymous() || child->isInFlowRenderFlowThread()) childStyleInRegion = RenderStyle::createAnonymousStyleWithDisplay(object->style(), child->style()->display()); else if (child->isText()) childStyleInRegion = RenderStyle::clone(object->style()); else childStyleInRegion = computeStyleInRegion(child); } setObjectStyleInRegion(child, childStyleInRegion, objectRegionStyleCached); computeChildrenStyleInRegion(child); } }
void RenderNamedFlowFragment::computeChildrenStyleInRegion(RenderElement& renderer) { for (auto& child : childrenOfType<RenderObject>(renderer)) { auto it = m_renderObjectRegionStyle.find(&child); RefPtr<RenderStyle> childStyleInRegion; bool objectRegionStyleCached = false; if (it != m_renderObjectRegionStyle.end()) { childStyleInRegion = it->value.style; objectRegionStyleCached = true; } else { if (child.isAnonymous() || child.isInFlowRenderFlowThread()) childStyleInRegion = RenderStyle::createAnonymousStyleWithDisplay(&renderer.style(), child.style().display()); else if (child.isText()) childStyleInRegion = RenderStyle::clone(&renderer.style()); else childStyleInRegion = computeStyleInRegion(toRenderElement(child), renderer.style()); } setObjectStyleInRegion(&child, childStyleInRegion, objectRegionStyleCached); if (child.isRenderElement()) computeChildrenStyleInRegion(toRenderElement(child)); } }
void RenderNamedFlowFragment::computeChildrenStyleInRegion(const RenderElement* object) { for (RenderObject* child = object->firstChild(); child; child = child->nextSibling()) { auto it = m_renderObjectRegionStyle.find(child); RefPtr<RenderStyle> childStyleInRegion; bool objectRegionStyleCached = false; if (it != m_renderObjectRegionStyle.end()) { childStyleInRegion = it->value.style; objectRegionStyleCached = true; } else { if (child->isAnonymous() || child->isInFlowRenderFlowThread()) childStyleInRegion = RenderStyle::createAnonymousStyleWithDisplay(&object->style(), child->style().display()); else if (child->isText()) childStyleInRegion = RenderStyle::clone(&object->style()); else childStyleInRegion = computeStyleInRegion(child); } setObjectStyleInRegion(child, childStyleInRegion, objectRegionStyleCached); if (child->isRenderElement()) computeChildrenStyleInRegion(toRenderElement(child)); } }
PassRefPtr<RenderStyle> RenderRegion::renderBoxRegionStyle(const RenderBox* renderBox) { // The box for which we are asking for style in region should have its info present // in the region box info map. ASSERT(m_renderBoxRegionInfo.find(renderBox) != m_renderBoxRegionInfo.end()); RenderBoxRegionStyleMap::iterator it = m_renderBoxRegionStyle.find(renderBox); if (it != m_renderBoxRegionStyle.end()) return it->second; return computeStyleInRegion(renderBox); }
void RenderRegion::setRegionObjectsRegionStyle() { if (!hasCustomRegionStyle()) return; // Start from content nodes and recursively compute the style in region for the render objects below. // If the style in region was already computed, used that style instead of computing a new one. RenderNamedFlowThread* namedFlow = view()->flowThreadController()->ensureRenderFlowThreadWithName(style()->regionThread()); const NamedFlowContentNodes& contentNodes = namedFlow->contentNodes(); for (NamedFlowContentNodes::const_iterator iter = contentNodes.begin(), end = contentNodes.end(); iter != end; ++iter) { const Node* node = *iter; // The list of content nodes contains also the nodes with display:none. if (!node->renderer()) continue; RenderObject* object = node->renderer(); // If the content node does not flow any of its children in this region, // we do not compute any style for them in this region. if (!flowThread()->objectInFlowRegion(object, this)) continue; // If the object has style in region, use that instead of computing a new one. RenderObjectRegionStyleMap::iterator it = m_renderObjectRegionStyle.find(object); RefPtr<RenderStyle> objectStyleInRegion; bool objectRegionStyleCached = false; if (it != m_renderObjectRegionStyle.end()) { objectStyleInRegion = it->value.style; ASSERT(it->value.cached); objectRegionStyleCached = true; } else objectStyleInRegion = computeStyleInRegion(object); setObjectStyleInRegion(object, objectStyleInRegion, objectRegionStyleCached); computeChildrenStyleInRegion(object); } }
void RenderNamedFlowFragment::setRegionObjectsRegionStyle() { if (!hasCustomRegionStyle()) return; // Start from content nodes and recursively compute the style in region for the render objects below. // If the style in region was already computed, used that style instead of computing a new one. const RenderNamedFlowThread& namedFlow = view().flowThreadController().ensureRenderFlowThreadWithName(style().regionThread()); const NamedFlowContentElements& contentElements = namedFlow.contentElements(); for (const auto& element : contentElements) { // The list of content nodes contains also the nodes with display:none. if (!element->renderer()) continue; RenderElement* object = element->renderer(); // If the content node does not flow any of its children in this region, // we do not compute any style for them in this region. if (!flowThread()->objectInFlowRegion(object, this)) continue; // If the object has style in region, use that instead of computing a new one. auto it = m_renderObjectRegionStyle.find(object); std::unique_ptr<RenderStyle> objectStyleInRegion; bool objectRegionStyleCached = false; if (it != m_renderObjectRegionStyle.end()) { objectStyleInRegion = RenderStyle::clonePtr(*it->value.style); ASSERT(it->value.cached); objectRegionStyleCached = true; } else objectStyleInRegion = computeStyleInRegion(*object, style()); setObjectStyleInRegion(object, WTFMove(objectStyleInRegion), objectRegionStyleCached); computeChildrenStyleInRegion(*object); } }