add history.pushState support