module.exports = LocationHistory function LocationHistory () { if (!new.target) return new LocationHistory() this._history = [] this._forward = [] this._pending = null } LocationHistory.prototype.go = function (page) { console.log('go', page) this.clearForward() this._go(page) } LocationHistory.prototype._go = function (page) { if (this._pending) return if (page.onbeforeload) { this._pending = page page.onbeforeload((err) => { if (err) return if (this._pending !== page) return /* navigation was cancelled */ this._pending = null this._history.push(page) }) } else { this._history.push(page) } } LocationHistory.prototype.back = function () { if (this._history.length <= 1) return var page = this._history.pop() if (page.onbeforeunload) { page.onbeforeunload(() => { this._forward.push(page) }) } else { this._forward.push(page) } } LocationHistory.prototype.forward = function () { if (this._forward.length === 0) return var page = this._forward.pop() this._go(page) } LocationHistory.prototype.clearForward = function () { this._forward = [] } LocationHistory.prototype.current = function () { return this._history[this._history.length - 1] } LocationHistory.prototype.hasBack = function () { return this._history.length > 1 } LocationHistory.prototype.hasForward = function () { return this._forward.length > 0 } LocationHistory.prototype.pending = function () { return this._pending } LocationHistory.prototype.clearPending = function () { this._pending = null }