Test cases
- Same link (change URL without API request, use pushState API)
- Existing URL (require API if not in cache)
- Non-existing URL (return error page)
- Ouside API scope (prevent Ajax request and act as usual link)
- Issues
- #63040 Chrome fires initial popstate, fixed on Chrome 34
- Webkit fires initial popstate while injected script, fixed on Chrome 35
- #371549 Chrome repeatedly repeated same hash URL history/popstate by onclick on same URL (hangs on error page and recreates XMLHttpRequest)
- #428916 Firefox doesn't retry new XMLHttpRequest but instead returns cache
- #264412 innerText standardized and landed in Firefox 45
- Webkit fires initial popstate while injected script, fixed on Chrome 35