diff options
author | Atul Pratap Singh <atulpratapsingh05@gmail.com> | 2015-07-09 08:02:55 +0300 |
---|---|---|
committer | Atul Pratap Singh <atulpratapsingh05@gmail.com> | 2015-07-09 08:02:55 +0300 |
commit | 9b101e2ab726b656337d3349af392b4c5c1bdc10 (patch) | |
tree | 86a41c99de35afc1af5f36b2325a60adafd7df22 /js/ajax.js | |
parent | 0e31b6e24fb494eeb4ecf1ada6b9345ac884ca3f (diff) |
Separate microhistory code conditionally
Signed-off-by: Atul Pratap Singh <atulpratapsingh05@gmail.com>
Diffstat (limited to 'js/ajax.js')
-rw-r--r-- | js/ajax.js | 420 |
1 files changed, 57 insertions, 363 deletions
diff --git a/js/ajax.js b/js/ajax.js index 8e9af8940d..1c6930ef10 100644 --- a/js/ajax.js +++ b/js/ajax.js @@ -184,6 +184,15 @@ var AJAX = { AJAX.lockedTargets = {}; $('#lock_page_icon').html(''); }, + handleMenu: { + replace: function (content) { + $('#floating_menubar').html(content) + // Remove duplicate wrapper + // TODO: don't send it in the response + .children().first().remove(); + $('#topmenu').menuResizer(PMA_mainMenuResizerCallback); + } + }, /** * Event handler for clicks on links and form submissions * @@ -264,8 +273,10 @@ var AJAX = { if (! isLink) { params += '&' + $(this).serialize(); } - // Add a list of menu hashes that we have in the cache to the request - params += AJAX.cache.menus.getRequestParam(); + if (! (history && history.pushState)) { + // Add a list of menu hashes that we have in the cache to the request + params += PMA_MicroHistory.menus.getRequestParam(); + } if (AJAX._debug) { console.log("Loading: " + url); // no need to translate @@ -328,10 +339,15 @@ var AJAX = { $('title').replaceWith(data._title); } if (data._menu) { - AJAX.cache.menus.replace(data._menu); - AJAX.cache.menus.add(data._menuHash, data._menu); + + if (! (history && history.pushState)) { + PMA_MicroHistory.menus.replace(data._menu); + PMA_MicroHistory.menus.add(data._menuHash, data._menu); + } } else if (data._menuHash) { - AJAX.cache.menus.replace(AJAX.cache.menus.get(data._menuHash)); + if (! (history && history.pushState)) { + PMA_MicroHistory.menus.replace(PMA_MicroHistory.menus.get(data._menuHash)); + } } if (data._disableNaviSettings) { PMA_disableNaviSettings(); @@ -382,13 +398,15 @@ var AJAX = { AJAX.scriptHandler.load(data._scripts); } if (data._selflink && data._scripts && data._menuHash && data._params) { - AJAX.cache.add( - data._selflink, - data._scripts, - data._menuHash, - data._params, - AJAX.source.attr('rel') - ); + if (! (history && history.pushState)) { + PMA_MicroHistory.add( + data._selflink, + data._scripts, + data._menuHash, + data._params, + AJAX.source.attr('rel') + ); + } } if (data._params) { PMA_commonParams.setAll(data._params); @@ -585,7 +603,9 @@ var AJAX = { */ $(document).off('click', 'a').on('click', 'a', AJAX.requestHandler); $(document).off('submit', 'form').on('submit', 'form', AJAX.requestHandler); - AJAX.cache.update(); + if (! (history && history.pushState)) { + PMA_MicroHistory.update(); + } callback(); } } @@ -655,363 +675,37 @@ AJAX.registerOnload('functions.js', function () { }); /** - * An implementation of a client-side page cache. - * This object also uses the cache to provide a simple microhistory, - * that is the ability to use the back and forward buttons in the browser + * Page load event handler */ -AJAX.cache = { - /** - * @var int The maximum number of pages to keep in the cache - */ - MAX: 6, - /** - * @var object A hash used to prime the cache with data about the initially - * loaded page. This is set in the footer, and then loaded - * by a double-queued event further down this file. - */ - primer: {}, - /** - * @var array Stores the content of the cached pages - */ - pages: [], - /** - * @var int The index of the currently loaded page - * This is used to know at which point in the history we are - */ - current: 0, - /** - * Saves a new page in the cache - * - * @param string hash The hash part of the url that is being loaded - * @param array scripts A list of scripts that is required for the page - * @param string menu A hash that links to a menu stored - * in a dedicated menu cache - * @param array params A list of parameters used by PMA_commonParams() - * @param string rel A relationship to the current page: - * 'samepage': Forces the response to be treated as - * the same page as the current one - * 'newpage': Forces the response to be treated as - * a new page - * undefined: Default behaviour, 'samepage' if the - * selflinks of the two pages are the same. - * 'newpage' otherwise - * - * @return void - */ - add: function (hash, scripts, menu, params, rel) { - if (this.pages.length > AJAX.cache.MAX) { - // Trim the cache, to the maximum number of allowed entries - // This way we will have a cached menu for every page - for (var i = 0; i < this.pages.length - this.MAX; i++) { - delete this.pages[i]; - } - } - while (this.current < this.pages.length) { - // trim the cache if we went back in the history - // and are now going forward again - this.pages.pop(); - } - if (rel === 'newpage' || - ( - typeof rel === 'undefined' && ( - typeof this.pages[this.current - 1] === 'undefined' || - this.pages[this.current - 1].hash !== hash - ) - ) - ) { - this.pages.push({ - hash: hash, - content: $('#page_content').html(), - scripts: scripts, - selflink: $('#selflink').html(), - menu: menu, - params: params - }); - AJAX.setUrlHash(this.current, hash); - this.current++; - } - }, - /** - * Restores a page from the cache. This is called when the hash - * part of the url changes and it's structure appears to be valid - * - * @param string index Which page from the history to load - * - * @return void - */ - navigate: function (index) { - if (typeof this.pages[index] === 'undefined' || - typeof this.pages[index].content === 'undefined' || - typeof this.pages[index].menu === 'undefined' || - ! AJAX.cache.menus.get(this.pages[index].menu) - ) { - PMA_ajaxShowMessage( - '<div class="error">' + PMA_messages.strInvalidPage + '</div>', - false +$(function () { + if (history && history.pushState) { + // Add menu and scripts to history state object + } else { + // AJAX.scriptHandler.load(); + // Add the menu from the initial page into the cache + // The cache primer is set by the footer class + if (PMA_MicroHistory.primer.url) { + PMA_MicroHistory.menus.add( + PMA_MicroHistory.primer.menuHash, + $('<div></div>') + .append('<div></div>') + .append($('#serverinfo').clone()) + .append($('#topmenucontainer').clone()) + .html() ); - } else { - AJAX.active = true; - var record = this.pages[index]; - AJAX.scriptHandler.reset(function () { - $('#page_content').html(record.content); - $('#selflink').html(record.selflink); - AJAX.cache.menus.replace(AJAX.cache.menus.get(record.menu)); - PMA_commonParams.setAll(record.params); - AJAX.scriptHandler.load(record.scripts); - AJAX.cache.current = ++index; - }); - } - }, - /** - * Resaves the content of the current page in the cache. - * Necessary in order not to show the user some outdated version of the page - * - * @return void - */ - update: function () { - var page = this.pages[this.current - 1]; - if (page) { - page.content = $('#page_content').html(); - } - }, - /** - * @var object Dedicated menu cache - */ - menus: { - /** - * Returns the number of items in an associative array - * - * @return int - */ - size: function (obj) { - var size = 0, key; - for (key in obj) { - if (obj.hasOwnProperty(key)) { - size++; - } - } - return size; - }, - /** - * @var hash Stores the content of the cached menus - */ - data: {}, - /** - * Saves a new menu in the cache - * - * @param string hash The hash (trimmed md5) of the menu to be saved - * @param string content The HTML code of the menu to be saved - * - * @return void - */ - add: function (hash, content) { - if (this.size(this.data) > AJAX.cache.MAX) { - // when the cache grows, we remove the oldest entry - var oldest, key, init = 0; - for (var i in this.data) { - if (this.data[i]) { - if (! init || this.data[i].timestamp.getTime() < oldest.getTime()) { - oldest = this.data[i].timestamp; - key = i; - init = 1; - } - } - } - delete this.data[key]; - } - this.data[hash] = { - content: content, - timestamp: new Date() - }; - }, - /** - * Retrieves a menu given its hash - * - * @param string hash The hash of the menu to be retrieved - * - * @return string - */ - get: function (hash) { - if (this.data[hash]) { - return this.data[hash].content; - } else { - // This should never happen as long as the number of stored menus - // is larger or equal to the number of pages in the page cache - return ''; - } - }, - /** - * Prepares part of the parameter string used during page requests, - * this is necessary to tell the server which menus we have in the cache - * - * @return string - */ - getRequestParam: function () { - var param = ''; - var menuHashes = []; - for (var i in this.data) { - menuHashes.push(i); - } - var menuHashesParam = menuHashes.join('-'); - if (menuHashesParam) { - param = '&menuHashes=' + menuHashesParam; - } - return param; - }, - /** - * Replaces the menu with new content - * - * @return void - */ - replace: function (content) { - $('#floating_menubar').html(content) - // Remove duplicate wrapper - // TODO: don't send it in the response - .children().first().remove(); - $('#topmenu').menuResizer(PMA_mainMenuResizerCallback); - } - } -}; - -/** - * URL hash management module. - * Allows direct bookmarking and microhistory. - */ -AJAX.setUrlHash = (function (jQuery, window) { - "use strict"; - /** - * Indictaes whether we have already completed - * the initialisation of the hash - * - * @access private - */ - var ready = false; - /** - * Stores a hash that needed to be set when we were not ready - * - * @access private - */ - var savedHash = ""; - /** - * Flag to indicate if the change of hash was triggered - * by a user pressing the back/forward button or if - * the change was triggered internally - * - * @access private - */ - var userChange = true; - - // Fix favicon disappearing in Firefox when setting location.hash - function resetFavicon() { - if (navigator.userAgent.indexOf('Firefox') > -1) { - // Move the link tags for the favicon to the bottom - // of the head element to force a reload of the favicon - $('head > link[href=favicon\\.ico]').appendTo('head'); } - } - - /** - * Sets the hash part of the URL - * - * @access public - */ - function setUrlHash(index, hash) { - /* - * Known problem: - * Setting hash leads to reload in webkit: - * http://www.quirksmode.org/bugreports/archives/2005/05/Safari_13_visual_anomaly_with_windowlocationhref.html - * - * so we expect that users are not running an ancient Safari version - */ - - userChange = false; - if (ready) { - window.location.hash = "PMAURL-" + index + ":" + hash; - resetFavicon(); - } else { - savedHash = "PMAURL-" + index + ":" + hash; - } - } - /** - * Start initialisation - */ - if (window.location.hash.substring(0, 8) == '#PMAURL-') { - // We have a valid hash, let's redirect the user - // to the page that it's pointing to - var colon_position = window.location.hash.indexOf(':'); - var questionmark_position = window.location.hash.indexOf('?'); - if (colon_position != -1 && questionmark_position != -1 && colon_position < questionmark_position) { - var hash_url = window.location.hash.substring(colon_position + 1, questionmark_position); - if (PMA_gotoWhitelist.indexOf(hash_url) != -1) { - window.location = window.location.hash.substring( - colon_position + 1 + $(function () { + // Queue up this event twice to make sure that we get a copy + // of the page after all other onload events have been fired + if (PMA_MicroHistory.primer.url) { + PMA_MicroHistory.add( + PMA_MicroHistory.primer.url, + PMA_MicroHistory.primer.scripts, + PMA_MicroHistory.primer.menuHash ); } - } - } else { - // We don't have a valid hash, so we'll set it up - // when the page finishes loading - jQuery(function () { - /* Check if we should set URL */ - if (savedHash !== "") { - window.location.hash = savedHash; - savedHash = ""; - resetFavicon(); - } - // Indicate that we're done initialising - ready = true; }); } - /** - * Register an event handler for when the url hash changes - */ - jQuery(function () { - jQuery(window).hashchange(function () { - if (userChange === false) { - // Ignore internally triggered hash changes - userChange = true; - } else if (/^#PMAURL-\d+:/.test(window.location.hash)) { - // Change page if the hash changed was triggered by a user action - var index = window.location.hash.substring( - 8, window.location.hash.indexOf(':') - ); - AJAX.cache.navigate(index); - } - }); - }); - /** - * Publicly exposes a reference to the otherwise private setUrlHash function - */ - return setUrlHash; -})(jQuery, window); - -/** - * Page load event handler - */ -$(function () { - // Add the menu from the initial page into the cache - // The cache primer is set by the footer class - if (AJAX.cache.primer.url) { - AJAX.cache.menus.add( - AJAX.cache.primer.menuHash, - $('<div></div>') - .append('<div></div>') - .append($('#serverinfo').clone()) - .append($('#topmenucontainer').clone()) - .html() - ); - } - $(function () { - // Queue up this event twice to make sure that we get a copy - // of the page after all other onload events have been fired - if (AJAX.cache.primer.url) { - AJAX.cache.add( - AJAX.cache.primer.url, - AJAX.cache.primer.scripts, - AJAX.cache.primer.menuHash - ); - } - }); }); /** |