12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- /* @flow */
- import { inBrowser } from './dom'
- import { saveScrollPosition } from './scroll'
- import { genStateKey, setStateKey, getStateKey } from './state-key'
- import { extend } from './misc'
- export const supportsPushState =
- inBrowser &&
- (function () {
- const ua = window.navigator.userAgent
- if (
- (ua.indexOf('Android 2.') !== -1 || ua.indexOf('Android 4.0') !== -1) &&
- ua.indexOf('Mobile Safari') !== -1 &&
- ua.indexOf('Chrome') === -1 &&
- ua.indexOf('Windows Phone') === -1
- ) {
- return false
- }
- return window.history && typeof window.history.pushState === 'function'
- })()
- export function pushState (url?: string, replace?: boolean) {
- saveScrollPosition()
- // try...catch the pushState call to get around Safari
- // DOM Exception 18 where it limits to 100 pushState calls
- const history = window.history
- try {
- if (replace) {
- // preserve existing history state as it could be overriden by the user
- const stateCopy = extend({}, history.state)
- stateCopy.key = getStateKey()
- history.replaceState(stateCopy, '', url)
- } else {
- history.pushState({ key: setStateKey(genStateKey()) }, '', url)
- }
- } catch (e) {
- window.location[replace ? 'replace' : 'assign'](url)
- }
- }
- export function replaceState (url?: string) {
- pushState(url, true)
- }
|