void RenderLayerModelObject::addChildFocusRingRects(Vector<LayoutRect>& rects, const LayoutPoint& additionalOffset) const { for (RenderObject* current = slowFirstChild(); current; current = current->nextSibling()) { if (current->isText() || current->isListMarker()) continue; if (!current->isBox()) { current->addFocusRingRects(rects, additionalOffset); continue; } RenderBox* box = toRenderBox(current); if (!box->hasLayer()) { box->addFocusRingRects(rects, additionalOffset + box->locationOffset()); continue; } Vector<LayoutRect> layerFocusRingRects; box->addFocusRingRects(layerFocusRingRects, LayoutPoint()); for (size_t i = 0; i < layerFocusRingRects.size(); ++i) { FloatQuad quadInBox = box->localToContainerQuad(FloatQuad(layerFocusRingRects[i]), this); LayoutRect rect = LayoutRect(quadInBox.boundingBox()); if (!rect.isEmpty()) { rect.moveBy(additionalOffset); rects.append(rect); } } } }
LayoutRect RenderBoxModelObject::localCaretRectForEmptyElement(LayoutUnit width, LayoutUnit textIndentOffset) { ASSERT(!slowFirstChild()); // FIXME: This does not take into account either :first-line or :first-letter // However, as soon as some content is entered, the line boxes will be // constructed and this kludge is not called any more. So only the caret size // of an empty :first-line'd block is wrong. I think we can live with that. RenderStyle* currentStyle = firstLineStyle(); enum CaretAlignment { alignLeft, alignRight, alignCenter }; CaretAlignment alignment = alignLeft; switch (currentStyle->textAlign()) { case LEFT: case WEBKIT_LEFT: break; case CENTER: case WEBKIT_CENTER: alignment = alignCenter; break; case RIGHT: case WEBKIT_RIGHT: alignment = alignRight; break; case JUSTIFY: case TASTART: if (!currentStyle->isLeftToRightDirection()) alignment = alignRight; break; case TAEND: if (currentStyle->isLeftToRightDirection()) alignment = alignRight; break; } LayoutUnit x = borderLeft() + paddingLeft(); LayoutUnit maxX = width - borderRight() - paddingRight(); switch (alignment) { case alignLeft: if (currentStyle->isLeftToRightDirection()) x += textIndentOffset; break; case alignCenter: x = (x + maxX) / 2; if (currentStyle->isLeftToRightDirection()) x += textIndentOffset / 2; else x -= textIndentOffset / 2; break; case alignRight: x = maxX - caretWidth; if (!currentStyle->isLeftToRightDirection()) x -= textIndentOffset; break; } x = std::min(x, std::max<LayoutUnit>(maxX - caretWidth, 0)); LayoutUnit height = style()->fontMetrics().height(); LayoutUnit verticalSpace = lineHeight(true, currentStyle->isHorizontalWritingMode() ? HorizontalLine : VerticalLine, PositionOfInteriorLineBoxes) - height; LayoutUnit y = paddingTop() + borderTop() + (verticalSpace / 2); return currentStyle->isHorizontalWritingMode() ? LayoutRect(x, y, caretWidth, height) : LayoutRect(y, x, height, caretWidth); }