diff options
Diffstat (limited to 'resources/lib/oojs-router/oojs-router.js')
-rw-r--r-- | resources/lib/oojs-router/oojs-router.js | 231 |
1 files changed, 0 insertions, 231 deletions
diff --git a/resources/lib/oojs-router/oojs-router.js b/resources/lib/oojs-router/oojs-router.js deleted file mode 100644 index d0e24dd8dde7..000000000000 --- a/resources/lib/oojs-router/oojs-router.js +++ /dev/null @@ -1,231 +0,0 @@ -/*! - * OOjs Router v0.5.0 - * https://www.mediawiki.org/wiki/OOjs_Router - * - * Copyright 2011-2024 OOjs Team and other contributors. - * Released under the MIT license - * http://oojs.mit-license.org - * - * Date: 2024-03-04T20:48:16Z - */ -( function ( $ ) { - -'use strict'; - -/** - * Provides navigation routing and location information - * - * @class OO.Router - * @extends OO.Registry - */ -OO.Router = function OoRouter() { - const router = this; - - // Parent constructor - OO.Router.super.call( this ); - - this.enabled = true; - this.oldHash = this.getPath(); - - window.addEventListener( 'popstate', function () { - router.emit( 'popstate' ); - } ); - - window.addEventListener( 'hashchange', function () { - router.emit( 'hashchange' ); - } ); - - this.on( 'hashchange', function () { - // event.originalEvent.newURL is undefined on Android 2.x - let routeEvent; - - if ( router.enabled ) { - routeEvent = $.Event( 'route', { - path: router.getPath() - } ); - router.emit( 'route', routeEvent ); - - if ( !routeEvent.isDefaultPrevented() ) { - router.checkRoute(); - } else { - // if route was prevented, ignore the next hash change and revert the - // hash to its old value - router.enabled = false; - router.navigate( router.oldHash ); - } - } else { - router.enabled = true; - } - - router.oldHash = router.getPath(); - } ); -}; - -/* Inheritance */ - -OO.inheritClass( OO.Router, OO.Registry ); - -/* Events */ - -/** - * @event popstate - */ - -/** - * @event hashchange - */ - -/** - * @event route - * @param {jQuery.Event} routeEvent - */ - -/* Static Methods */ - -/** - * Determine if current browser supports this router - * - * @return {boolean} The browser is supported - */ -OO.Router.static.isSupported = function () { - return 'onhashchange' in window; -}; - -/* Methods */ - -/** - * Check the current route and run appropriate callback if it matches. - */ -OO.Router.prototype.checkRoute = function () { - const hash = this.getPath(); - - let id, entry, match; - - for ( id in this.registry ) { - entry = this.registry[ id ]; - match = hash.match( entry.path ); - if ( match ) { - entry.callback.apply( this, match.slice( 1 ) ); - return; - } - } -}; - -/** - * Bind a specific callback to a hash-based route, e.g. - * - * @example - * addRoute( 'alert', function () { alert( 'something' ); } ); - * addRoute( /hi-(.*)/, function ( name ) { alert( 'Hi ' + name ) } ); - * - * Note that after defining all available routes it is up to the caller - * to check the existing route via the checkRoute method. - * - * @param {string|RegExp} path Path to match, string or regular expression - * @param {Function} callback Callback to be run when hash changes to one - * that matches. - */ -OO.Router.prototype.addRoute = function ( path, callback ) { - const entry = { - path: typeof path === 'string' ? - // eslint-disable-next-line security/detect-non-literal-regexp - new RegExp( '^' + path.replace( /[\\^$*+?.()|[\]{}]/g, '\\$&' ) + '$' ) : - path, - callback: callback - }; - this.register( entry.path.toString(), entry ); -}; - -/** - * @deprecated Use #addRoute - */ -OO.Router.prototype.route = OO.Router.prototype.addRoute; - -/** - * Navigate to a specific route. - * - * @param {string} title of new page - * @param {Object} options - * @param {string} options.path e.g. '/path/' or '/path/#foo' - * @param {boolean} options.useReplaceState Set replaceStateState to use pushState when you want to - * avoid long history queues. - */ -OO.Router.prototype.navigateTo = function ( title, options ) { - if ( options.useReplaceState ) { - history.replaceState( null, title, options.path ); - } else { - history.pushState( null, title, options.path ); - } -}; - -/** - * Navigate to a specific ''hash fragment'' route. - * - * @param {string} path String with a route (hash without #). - * @deprecated use navigateTo instead - */ -OO.Router.prototype.navigate = function ( path ) { - // Take advantage of `pushState` when available, to clear the hash and - // not leave `#` in the history. An entry with `#` in the history has - // the side-effect of resetting the scroll position when navigating the - // history. - if ( path === '' ) { - // To clear the hash we need to cut the hash from the URL. - path = window.location.href.replace( /#.*$/, '' ); - history.pushState( null, document.title, path ); - this.checkRoute(); - } else { - window.location.hash = path; - } -}; - -/** - * Navigate to the previous route. This is a wrapper for window.history.back - * - * @return {jQuery.Promise} Promise which resolves when the back navigation is complete - */ -OO.Router.prototype.back = function () { - const router = this, - deferred = $.Deferred(); - - this.once( 'popstate', function () { - // eslint-disable-next-line no-use-before-define - clearTimeout( timeoutID ); - deferred.resolve(); - } ); - - window.history.back(); - - // If for some reason (old browser, bug in IE/windows 8.1, etc) popstate doesn't fire, - // resolve manually. Since we don't know for sure which browsers besides IE10/11 have - // this problem, it's better to fall back this way rather than singling out browsers - // and resolving the deferred request for them individually. - // See https://connect.microsoft.com/IE/feedback/details/793618/history-back-popstate-not-working-as-expected-in-webview-control - // Give browser a few ms to update its history. - const timeoutID = setTimeout( function () { - router.off( 'popstate' ); - deferred.resolve(); - }, 50 ); - - return deferred.promise(); -}; - -/** - * Get current path (hash). - * - * @return {string} Current path. - */ -OO.Router.prototype.getPath = function () { - return window.location.hash.slice( 1 ); -}; - -/** - * @deprecated Use static method - */ -OO.Router.prototype.isSupported = OO.Router.static.isSupported; - -if ( typeof module !== 'undefined' && module.exports ) { - module.exports = OO.Router; -} - -}( jQuery ) ); |