// Bounds of the LayoutObject relative to the scroller's visible content rect. static LayoutRect relativeBounds(const LayoutObject* layoutObject, const ScrollableArea* scroller) { LayoutRect localBounds; if (layoutObject->isBox()) { localBounds = toLayoutBox(layoutObject)->borderBoxRect(); if (!layoutObject->hasOverflowClip()) { // borderBoxRect doesn't include overflow content and floats. LayoutUnit maxHeight = std::max(localBounds.height(), toLayoutBox(layoutObject)->layoutOverflowRect().height()); if (layoutObject->isLayoutBlockFlow() && toLayoutBlockFlow(layoutObject)->containsFloats()) { // Note that lowestFloatLogicalBottom doesn't include floating // grandchildren. maxHeight = std::max( maxHeight, toLayoutBlockFlow(layoutObject)->lowestFloatLogicalBottom()); } localBounds.setHeight(maxHeight); } } else if (layoutObject->isText()) { // TODO(skobes): Use first and last InlineTextBox only? for (InlineTextBox* box = toLayoutText(layoutObject)->firstTextBox(); box; box = box->nextTextBox()) localBounds.unite(box->frameRect()); } else { // Only LayoutBox and LayoutText are supported. ASSERT_NOT_REACHED(); } LayoutRect relativeBounds = LayoutRect( scroller->localToVisibleContentQuad(FloatRect(localBounds), layoutObject) .boundingBox()); return relativeBounds; }