// The fast path failed. Try a more invasive method. This query does
// mutate the DOM, so the subsequent measurement queries will force
// synchronous layout, which can be slow.
OffsetPosition p = NativeSelectionUtil.slowGetPosition();
if (p != null && p.offsetParent != null) {
Extent viewportInContent = scroller.getViewport();
double focusInViewport = measurer.top(viewport, p.offsetParent) + p.top;
double focusInContent = focusInViewport + viewportInContent.getStart();
if (focusInContent - PAD_PX < viewportInContent.getStart()) {
scroller.moveTo(focusInContent - PAD_PX);
} else if (focusInContent + PAD_PX > viewportInContent.getEnd()) {
scroller.moveTo(focusInContent + PAD_PX - viewportInContent.getSize());
} else {
// All ok.
return;
}
}