define('jira/page/atl/prefetch', ['jira/util/data/meta', 'jira/data/local-storage', 'jira/ajs/dark-features', 'jquery', 'wrm/context-path'], function definePrefetchResource(meta, storage, darkFeatures, jQuery, wrmContextPath) { /** * A module for pre-fetching resources for given page before it is really visited. * is used to instruct browser which resources to pre download. * Currently used to prefetch view issue resources. * @exports jira/issue/resources-prefetch */ 'use strict'; var SESSION_KEY = 'jira.issue.prefetch.last.superbatch'; var stateToken = _getStateToken(); // // Private functions // function _getStateToken() { //lets use last super batch url as token with date as browser most probably removed entries from cache var now = new Date(); var dateStr = now.getFullYear().toString() + now.getMonth().toString() + now.getDate().toString(); var superbatch = jQuery('head > script').filter(function findSuperbatch(a, b) { return b.src.indexOf('/_super') > 0; }); return (superbatch.length > 0 ? superbatch[0].src : 'empty') + dateStr; } function _addPrefetchTag(url) { jQuery('', { rel: 'prefetch', href: url }).appendTo('head'); } /** * @param {Object} issueMenuData - data for view issue menu. * @param {Object} [issueMenuData.sections] - optional section in view issue menu. */ function _getLastIssueFromMenu(issueMenuData) { var sections = issueMenuData.sections; if (!sections) { return; } var recentIssues = sections.filter(function filterMenu(menuItem) { return menuItem.id === 'issues_history_main'; }); if (recentIssues.length && recentIssues[0].items.length !== 0) { var lastIssue = recentIssues[0].items[0]; return lastIssue.url; } } function _addPrefetchForRegex(response, regex) { var matchResult; while (matchResult = regex.exec(response)) { var url = matchResult[1].replace(/&/g, '&'); _addPrefetchTag(url); } } function _rememberFetchState() { try { storage.setItem(SESSION_KEY, stateToken); } catch (e) {} } function _parsePageAndInsertLinks(data) { _addPrefetchForRegex(data, //g); _addPrefetchForRegex(data, //g); _rememberFetchState(); } function _shouldFetchResources() { if (!darkFeatures.isEnabled('jira.issue.prefetch')) { //don't fetch if dark feature is not enabled return false; } if (jQuery('#isNavigator').length === 1) { //don't fetch on navigator as this has the same resources as issue _rememberFetchState(); return false; } else if (meta.get('issue-key')) { //don't fetch on issue page _rememberFetchState(); return false; } else { //fetch if current state token is different for stored in local storage return stateToken !== storage.getItem(SESSION_KEY); } } function _prefetchResourcesForLastIssue(data) { var issueUrl = _getLastIssueFromMenu(data); if (issueUrl) { prefetchResourcesForUrl(issueUrl); } } // // Public API functions // function prefetchResourcesForUrl(url) { jQuery.get(url, _parsePageAndInsertLinks); } function prefetchViewIssueResources() { if (_shouldFetchResources()) { //only execute if we are on view issue context and jQuery.ajax({ url: wrmContextPath() + '/rest/api/1.0/menus/find_link?inAdminMode=false', dataType: 'json' }).done(_prefetchResourcesForLastIssue); } } return { /** * Adds prefetch tags for resources included by page at given URL * @param {String} url */ prefetchResourcesForUrl: prefetchResourcesForUrl, /** * Adds prefetch tags for view issue resources. * It will work only if user has visited any issue in the past so it is accessible from latest issues menu. */ prefetchViewIssueResources: prefetchViewIssueResources }; });