GUAC-1378: Evict cache of $templateRequest results when $templateCache is modified externally.
Project: http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/commit/c01e8c6a Tree: http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/tree/c01e8c6a Diff: http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/diff/c01e8c6a Branch: refs/heads/master Commit: c01e8c6a9a6037295272353910ad11bc0bff1562 Parents: 8f17e9e Author: Michael Jumper <[email protected]> Authored: Thu Feb 18 19:52:44 2016 -0800 Committer: Michael Jumper <[email protected]> Committed: Thu Feb 18 19:56:21 2016 -0800 ---------------------------------------------------------------------- .../index/config/templateRequestDecorator.js | 64 ++++++++++++++++---- 1 file changed, 53 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/c01e8c6a/guacamole/src/main/webapp/app/index/config/templateRequestDecorator.js ---------------------------------------------------------------------- diff --git a/guacamole/src/main/webapp/app/index/config/templateRequestDecorator.js b/guacamole/src/main/webapp/app/index/config/templateRequestDecorator.js index 43655bc..07b669b 100644 --- a/guacamole/src/main/webapp/app/index/config/templateRequestDecorator.js +++ b/guacamole/src/main/webapp/app/index/config/templateRequestDecorator.js @@ -22,24 +22,66 @@ /** * Overrides $templateRequest such that HTML patches defined within Guacamole - * extensions are automatically applied to template contents. + * extensions are automatically applied to template contents. As the results of + * $templateRequest are cached internally, $templateCache is also overridden to + * update the internal cache as necessary. */ angular.module('index').config(['$provide', function($provide) { - $provide.decorator('$templateRequest', ['$delegate', '$injector', - function decorateTemplateRequest($delegate, $injector) { - // Required services - var $q = $injector.get('$q'); + /** + * A map of previously-returned promises from past calls to + * $templateRequest(). Future calls to $templateRequest() will return + * new promises chained to the first promise returned for a given URL, + * rather than redo patch processing for every request. + * + * @type Object.<String, Promise.<String>> + */ + var promiseCache = {}; + + // Decorate $templateCache such that promiseCache is updated if a template + // is modified within $templateCache at runtime + $provide.decorator('$templateCache', ['$delegate', + function decorateTemplateCache($delegate) { + + // Create shallow copy of original $templateCache which we can safely + // override + var decoratedTemplateCache = angular.extend({}, $delegate); /** - * A map of previously-returned promises from past calls to - * $templateRequest(). Future calls to $templateRequest() will return - * new promises chained to the first promise returned for a given URL, - * rather than redo patch processing for every request. + * Overridden version of $templateCache.put() which automatically + * invalidates the cached $templateRequest result when used. Only the + * URL parameter is defined, as all other arguments, if any, will be + * passed through to the original $templateCache.put() when the actual + * put() operation is performed. + * + * @param {String} url + * The URL of the template whose entry is being updated. * - * @type Object.<String, Promise.<String>> + * @return {Object} + * The value returned by $templateCache.put(), which is defined as + * being the value that was just stored at the provided URL. */ - var promiseCache = {}; + decoratedTemplateCache.put = function put(url) { + + // Evict old cached $templateRequest() result + delete promiseCache[url]; + + // Continue with originally-requested put() operation + return $delegate.put.apply(this, arguments); + + }; + + return decoratedTemplateCache; + + }]); + + // Decorate $templateRequest such that it automatically applies any HTML + // patches associated with installed Guacamole extensions + $provide.decorator('$templateRequest', ['$delegate', '$injector', + function decorateTemplateRequest($delegate, $injector) { + + // Required services + var $q = $injector.get('$q'); /** * Array of the raw HTML of all patches which should be applied to the
