UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

126 lines (101 loc) 2.94 kB
/* ************************************************************************ qooxdoo - the new era of web development http://qooxdoo.org Copyright: 2004-2008 1&1 Internet AG, Germany, http://www.1und1.de License: MIT: https://opensource.org/licenses/MIT See the LICENSE file in the project's top-level directory for details. Authors: * Sebastian Werner (wpbasti) * Andreas Ecker (ecker) * Fabian Jakobs (fjakobs) ************************************************************************ */ /** * Default history manager implementation. Either polls for URL fragment * identifier (hash) changes or uses the native "hashchange" event. * * NOTE: Instances of this class must be disposed of after use * * @internal */ qx.Class.define("qx.bom.NativeHistory", { extend : qx.bom.History, implement: [ qx.core.IDisposable ], construct : function() { this.base(arguments); this.__attachListeners(); }, members : { __checkOnHashChange : null, /** * Attach hash change listeners */ __attachListeners : function() { if (qx.bom.History.SUPPORTS_HASH_CHANGE_EVENT) { var boundFunc = qx.lang.Function.bind(this.__onHashChange, this); this.__checkOnHashChange = qx.event.GlobalError.observeMethod(boundFunc); qx.bom.Event.addNativeListener(window, "hashchange", this.__checkOnHashChange); } else { qx.event.Idle.getInstance().addListener("interval", this.__onHashChange, this); } }, /** * Remove hash change listeners */ __detatchListeners : function() { if (qx.bom.History.SUPPORTS_HASH_CHANGE_EVENT) { qx.bom.Event.removeNativeListener(window, "hashchange", this.__checkOnHashChange); } else { qx.event.Idle.getInstance().removeListener("interval", this.__onHashChange, this); } }, /** * hash change event handler */ __onHashChange : function() { var currentState = this._readState(); if (qx.lang.Type.isString(currentState) && currentState != this.getState()) { this._onHistoryLoad(currentState); } }, /** * Browser dependent function to read the current state of the history * * @return {String} current state of the browser history */ _readState : function() { return this._decode(this._getHash()); }, /** * Save a state into the browser history. * * @param state {String} state to save */ _writeState : qx.core.Environment.select("engine.name", { "opera" : function(state) { qx.event.Timer.once(function() { this._setHash(this._encode(state)); }, this, 0); }, "default" : function (state) { this._setHash(this._encode(state)); } }) }, destruct : function() { this.__detatchListeners(); } });