function polyfillCustomEvent() { if (typeof window.CustomEvent === "function") return false; function CustomEvent(event, params) { params = params || { bubbles: false, cancelable: false, detail: undefined }; var evt = document.createEvent("CustomEvent"); evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail ); return evt; } CustomEvent.prototype = window.Event.prototype; window.CustomEvent = CustomEvent; } function runOnceFor(object, flag, cb) { if (!object[flag]) { object[flag] = true; cb(); } } let MISSING_HISTORY = Symbol("missing_history"); export default function addMissingHistoryEvents(window, history) { runOnceFor(history, MISSING_HISTORY, () => { const pushState = history.pushState.bind(history); const replaceState = history.replaceState.bind(history); polyfillCustomEvent(); history.pushState = function(state, title, url) { let result = pushState(...arguments); var pushstate = new CustomEvent("pushstate", { detail: { state, title, url } }); window.dispatchEvent(pushstate); return result; }; history.replaceState = function(state, title, url) { const result = replaceState(...arguments); var replacestate = new CustomEvent("replacestate", { detail: { state, title, url } }); window.dispatchEvent(replacestate); return result; }; }); }