void Frame::scrollOverflowLayer(RenderLayer* layer, const IntRect& visibleRect, const IntRect& exposeRect) { if (!layer) return; RenderBox* box = layer->renderBox(); if (!box) return; if (visibleRect.intersects(exposeRect)) return; // FIXME: Why isn't this just calling RenderLayer::scrollRectToVisible()? ScrollOffset scrollOffset = layer->scrollOffset(); int exposeLeft = exposeRect.x(); int exposeRight = exposeLeft + exposeRect.width(); int clientWidth = roundToInt(box->clientWidth()); if (exposeLeft <= 0) scrollOffset.setX(std::max(0, scrollOffset.x() + exposeLeft - clientWidth / 2)); else if (exposeRight >= clientWidth) scrollOffset.setX(std::min(box->scrollWidth() - clientWidth, scrollOffset.x() + clientWidth / 2)); int exposeTop = exposeRect.y(); int exposeBottom = exposeTop + exposeRect.height(); int clientHeight = roundToInt(box->clientHeight()); if (exposeTop <= 0) scrollOffset.setY(std::max(0, scrollOffset.y() + exposeTop - clientHeight / 2)); else if (exposeBottom >= clientHeight) scrollOffset.setY(std::min(box->scrollHeight() - clientHeight, scrollOffset.y() + clientHeight / 2)); layer->scrollToOffset(scrollOffset); selection().setCaretRectNeedsUpdate(); selection().updateAppearance(); }