git.fiddlerwoaroof.com
src/history-events.js
30db14b1
 
 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 debounce(object, flag, cb) {
   if (!object[flag]) {
     object[flag] = true;
     cb();
   }
 }
 
 let MISSING_HISTORY = Symbol("missing_history");
 export default function addMissingHistoryEvents(window, history) {
   debounce(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;
     };
   });
 }