bool HTMLSummaryElement::childShouldCreateRenderer(const NodeRenderingContext& childContext) const { if (childContext.node()->isPseudoElement()) return HTMLElement::childShouldCreateRenderer(childContext); return childContext.isOnEncapsulationBoundary() && HTMLElement::childShouldCreateRenderer(childContext); }
bool HTMLDetailsElement::childShouldCreateRenderer(const NodeRenderingContext& childContext) const { if (!childContext.isOnEncapsulationBoundary()) return false; if (m_isOpen) return HTMLElement::childShouldCreateRenderer(childContext); if (!childContext.node()->hasTagName(summaryTag)) return false; return childContext.node() == findMainSummary() && HTMLElement::childShouldCreateRenderer(childContext); }
bool HTMLFormElement::rendererIsNeeded(const NodeRenderingContext& context) { if (!m_wasDemoted) return HTMLElement::rendererIsNeeded(context); ContainerNode* node = parentNode(); RenderObject* parentRenderer = node->renderer(); // FIXME: Shouldn't we also check for table caption (see |formIsTablePart| below). bool parentIsTableElementPart = (parentRenderer->isTable() && node->hasTagName(tableTag)) || (parentRenderer->isTableRow() && node->hasTagName(trTag)) || (parentRenderer->isTableSection() && node->hasTagName(tbodyTag)) || (parentRenderer->isRenderTableCol() && node->hasTagName(colTag)) || (parentRenderer->isTableCell() && node->hasTagName(trTag)); if (!parentIsTableElementPart) return true; EDisplay display = context.style()->display(); bool formIsTablePart = display == TABLE || display == INLINE_TABLE || display == TABLE_ROW_GROUP || display == TABLE_HEADER_GROUP || display == TABLE_FOOTER_GROUP || display == TABLE_ROW || display == TABLE_COLUMN_GROUP || display == TABLE_COLUMN || display == TABLE_CELL || display == TABLE_CAPTION; return formIsTablePart; }
bool Text::textRendererIsNeeded(const NodeRenderingContext& context) { if (isEditingText()) return true; if (!length()) return false; if (context.style()->display() == NONE) return false; if (!containsOnlyWhitespace()) return true; RenderObject* parent = context.parentRenderer(); if (!parent->canHaveWhitespaceChildren()) return false; if (context.style()->preserveNewline()) // pre/pre-wrap/pre-line always make renderers. return true; RenderObject* prev = context.previousRenderer(); if (prev && prev->isBR()) // <span><br/> <br/></span> return false; if (parent->isRenderInline()) { // <span><div/> <div/></span> if (prev && !prev->isInline()) return false; } else { if (parent->isRenderBlock() && !parent->childrenInline() && (!prev || !prev->isInline())) return false; // Avoiding creation of a Renderer for the text node is a non-essential memory optimization. // So to avoid blowing up on very wide DOMs, we limit the number of siblings to visit. unsigned maxSiblingsToVisit = 50; RenderObject* first = parent->firstChild(); while (first && first->isFloatingOrOutOfFlowPositioned() && maxSiblingsToVisit--) first = first->nextSibling(); if (!first || context.nextRenderer() == first) // Whitespace at the start of a block just goes away. Don't even // make a render object for this text. return false; } return true; }
bool Text::textRendererIsNeeded(const NodeRenderingContext& context) { if (isEditingText()) return true; if (!length()) return false; if (context.style()->display() == NONE) return false; bool onlyWS = containsOnlyWhitespace(); if (!onlyWS) return true; RenderObject* parent = context.parentRenderer(); if (parent->isTable() || parent->isTableRow() || parent->isTableSection() || parent->isRenderTableCol() || parent->isFrameSet()) return false; if (context.style()->preserveNewline()) // pre/pre-wrap/pre-line always make renderers. return true; RenderObject* prev = context.previousRenderer(); if (prev && prev->isBR()) // <span><br/> <br/></span> return false; if (parent->isRenderInline()) { // <span><div/> <div/></span> if (prev && !prev->isInline()) return false; } else { if (parent->isRenderBlock() && !parent->childrenInline() && (!prev || !prev->isInline())) return false; RenderObject* first = parent->firstChild(); while (first && first->isFloatingOrOutOfFlowPositioned()) first = first->nextSibling(); if (!first || context.nextRenderer() == first) { // Whitespace at the start of a block just goes away. Don't even // make a render object for this text. return false; } } return true; }
bool SVGSwitchElement::childShouldCreateRenderer(const NodeRenderingContext& childContext) const { // FIXME: This function does not do what the comment below implies it does. // It will create a renderer for any valid SVG element children, not just the first one. for (Node* node = firstChild(); node; node = node->nextSibling()) { if (!node->isSVGElement()) continue; SVGElement* element = toSVGElement(node); if (!element || !element->isValid()) continue; return node == childContext.node(); // Only allow this child if it's the first valid child } return false; }
bool SVGTextElement::childShouldCreateRenderer(const NodeRenderingContext& childContext) const { if (childContext.node()->isTextNode() || childContext.node()->hasTagName(SVGNames::aTag) #if ENABLE(SVG_FONTS) || childContext.node()->hasTagName(SVGNames::altGlyphTag) #endif || childContext.node()->hasTagName(SVGNames::textPathTag) || childContext.node()->hasTagName(SVGNames::trefTag) || childContext.node()->hasTagName(SVGNames::tspanTag)) return true; return false; }
bool HTMLProgressElement::childShouldCreateRenderer(const NodeRenderingContext& childContext) const { return childContext.isOnUpperEncapsulationBoundary() && HTMLElement::childShouldCreateRenderer(childContext); }
bool SVGDocument::childShouldCreateRenderer(const NodeRenderingContext& childContext) const { if (childContext.node()->hasTagName(SVGNames::svgTag)) return toSVGSVGElement(childContext.node())->isValid(); return true; }
bool HTMLIFrameElement::rendererIsNeeded(const NodeRenderingContext& context) { return isURLAllowed() && context.style()->display() != NONE; }
bool HTMLFrameSetElement::rendererIsNeeded(const NodeRenderingContext& context) { // For compatibility, frames render even when display: none is set. // However, we delay creating a renderer until stylesheets have loaded. return context.style()->isStyleAvailable(); }
bool SVGAltGlyphElement::childShouldCreateRenderer(const NodeRenderingContext& childContext) const { if (childContext.node()->isTextNode()) return true; return false; }
bool PseudoElement::rendererIsNeeded(const NodeRenderingContext& context) { return pseudoElementRendererIsNeeded(context.style()); }