add pushState support with fallback