blob: db9e14409d90be51fe466b84eb6e0b4e764ca9ab [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Automatically reloads the current page and clears relevant browser cache if
* the build that produced index.html is different/older than the build that
* produced the JavaScript loaded by index.html.
*
* @private
* @param {Location} location
* The Location object representing the URL of the current page.
*
* @param {Storate} [sessionStorage]
* The Storage object that should optionally be used to avoid reloading the
* current page in a loop if it proves impossible to clear cache.
*/
(function verifyCachedVersion(location, sessionStorage) {
/**
* The meta element containing the build identifier of the Guacamole build
* that produced index.html.
*
* @private
* @type {HTMLMetaElement}
*/
var buildMeta = document.head.querySelector('meta[name=build]');
// Verify that index.html came from the same build as this JavaScript file,
// forcing a reload if out-of-date
if (!buildMeta || buildMeta.content !== '${guacamole.build.identifier}') {
if (sessionStorage) {
// Bail out if we have already tried to automatically refresh the
// cache but were unsuccessful
if (sessionStorage.getItem('reloadedFor') === '${guacamole.build.identifier}') {
console.warn('The version of Guacamole cached by your '
+ 'browser does not match the version of Guacamole on the '
+ 'server. To avoid unexpected errors, please clear your '
+ 'browser cache.');
return;
}
sessionStorage.setItem('reloadedFor', '${guacamole.build.identifier}');
}
// Force refresh of cache by issuing an HTTP request with headers that
// request revalidation of cached content
var xhr = new XMLHttpRequest();
xhr.open('GET', '', true);
xhr.setRequestHeader('Cache-Control', 'no-cache');
xhr.setRequestHeader('Pragma', 'no-cache');
xhr.onreadystatechange = function readyStateChanged() {
// Reload current page when ready (this call to reload MAY be
// sufficient in itself to clear cache, but this is not
// guaranteed by any standard)
if (xhr.readyState === XMLHttpRequest.DONE)
location.reload(true);
};
xhr.send();
}
})(window.location, window.sessionStorage);