Currently the setters for scrollTop and scrollLeft forces a layout each time they are called:
void Element::setScrollTop(int newTop)
if (RenderBox* rend = renderBox())
rend->setScrollTop(static_cast<int>(newTop * rend->style()->effectiveZoom()));
The only reason to do that is to be able to clamp the value to the height / width of the box (see the logic in RenderLayer).
This is confusing from a web-developer perspective and also the layout could be postponed until really necessary.
There is one big issue with coalescing layouts: we cannot scroll until we actually do the layout as we need to clamp and scrolling dispatches the 'scroll' event. If the page listens to those events, I haven't found a good way to defer scrolling until we layout without breaking event dispatching.