void InspectorHighlight::appendNodeHighlight(Node* node, const InspectorHighlightConfig& highlightConfig) { LayoutObject* layoutObject = node->layoutObject(); if (!layoutObject) return; // LayoutSVGRoot should be highlighted through the isBox() code path, all other SVG elements should just dump their absoluteQuads(). if (layoutObject->node() && layoutObject->node()->isSVGElement() && !layoutObject->isSVGRoot()) { Vector<FloatQuad> quads; layoutObject->absoluteQuads(quads); FrameView* containingView = layoutObject->frameView(); for (size_t i = 0; i < quads.size(); ++i) { if (containingView) contentsQuadToViewport(containingView, quads[i]); appendQuad(quads[i], highlightConfig.content, highlightConfig.contentOutline); } return; } FloatQuad content, padding, border, margin; if (!buildNodeQuads(node, &content, &padding, &border, &margin)) return; appendQuad(content, highlightConfig.content, highlightConfig.contentOutline, "content"); appendQuad(padding, highlightConfig.padding, Color::transparent, "padding"); appendQuad(border, highlightConfig.border, Color::transparent, "border"); appendQuad(margin, highlightConfig.margin, Color::transparent, "margin"); }
void LinkHighlight::computeQuads(const Node& node, Vector<FloatQuad>& outQuads) const { if (!node.layoutObject()) return; LayoutObject* renderer = node.layoutObject(); // For inline elements, absoluteQuads will return a line box based on the line-height // and font metrics, which is technically incorrect as replaced elements like images // should use their intristic height and expand the linebox as needed. To get an // appropriately sized highlight we descend into the children and have them add their // boxes. if (renderer->isLayoutInline()) { for (Node* child = NodeRenderingTraversal::firstChild(node); child; child = NodeRenderingTraversal::nextSibling(*child)) computeQuads(*child, outQuads); } else { // FIXME: this does not need to be absolute, just in the paint invalidation container's space. renderer->absoluteQuads(outQuads); } }