void RenderInline::absoluteQuads(Vector<FloatQuad>& quads, bool topLevel) { for (InlineRunBox* curr = firstLineBox(); curr; curr = curr->nextLineBox()) { FloatRect localRect(curr->xPos(), curr->yPos(), curr->width(), curr->height()); quads.append(localToAbsoluteQuad(localRect)); } for (RenderObject* curr = firstChild(); curr; curr = curr->nextSibling()) { if (!curr->isText()) curr->absoluteQuads(quads, false); } if (continuation() && topLevel) continuation()->absoluteQuads(quads, topLevel); }
void RenderContainer::collectAbsoluteLineBoxQuads(Vector<FloatQuad>& quads, unsigned start, unsigned end, bool /*useSelectionHeight*/) { if (!children()->firstChild() && (isInline() || isAnonymousBlock())) { absoluteQuads(quads); return; } if (!children()->firstChild()) return; unsigned offset = start; for (RenderObject* child = childAt(start); child && offset < end; child = child->nextSibling(), ++offset) { if (child->isText() || child->isInline() || child->isAnonymousBlock()) child->absoluteQuads(quads); } }
void LinkHighlight::computeQuads(Node* node, Vector<FloatQuad>& outQuads) const { if (!node || !node->renderer()) return; RenderObject* renderer = node->renderer(); // 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->isRenderInline()) { for (Node* child = node->firstChild(); child; child = child->nextSibling()) computeQuads(child, outQuads); } else { renderer->absoluteQuads(outQuads); } }
void LinkHighlight::computeQuads(const Node& node, Vector<FloatQuad>& outQuads) const { if (!node.renderer()) return; RenderObject* renderer = node.renderer(); // 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->isRenderInline()) { 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); } }
void AndroidHitTestResult::buildHighlightRects() { m_highlightRects.clear(); Node* node = m_hitTestResult.URLElement(); if (!node || !node->renderer()) node = m_hitTestResult.innerNode(); if (!node || !node->renderer()) return; if (!WebViewCore::nodeIsClickableOrFocusable(node)) return; Frame* frame = node->document()->frame(); IntPoint frameOffset = m_webViewCore->convertGlobalContentToFrameContent(IntPoint(), frame); RenderObject* renderer = node->renderer(); Vector<FloatQuad> quads; if (renderer->isInline()) renderer->absoluteFocusRingQuads(quads); if (!quads.size()) renderer->absoluteQuads(quads); // No fancy rings, grab a bounding box for (size_t i = 0; i < quads.size(); i++) { IntRect boundingBox = quads[i].enclosingBoundingBox(); boundingBox.move(-frameOffset.x(), -frameOffset.y()); m_highlightRects.append(boundingBox); } }