When loading the page from the b/f cache, document()->view()->isOffscreen() returns true in RenderObject::willRenderImage(), so BitmapImage::startAnimation() returns without actually kicking off the animation.
In WebKit1, the ScrollView is a platform widget, so ScrollView::isOffscreen() calls [NSWindow isVisible]. In WebKit2, the ScrollView isn't a platform widget so it asks the WebCore Widget whether or not it is visible. It always returns false since setParentVisible(false) was called on the old ScrollView before navigating to a new page, but setParentVisible(true) is never called when restoring it from the back/forward cache.