diff --git a/UI/Templates/MailerUI/UIxMailViewTemplate.wox b/UI/Templates/MailerUI/UIxMailViewTemplate.wox
index 5c2cf6982..7b6e42432 100644
--- a/UI/Templates/MailerUI/UIxMailViewTemplate.wox
+++ b/UI/Templates/MailerUI/UIxMailViewTemplate.wox
@@ -59,8 +59,9 @@
ng-click="doDelete(message)">
+ ng-show="message.$hasUnsafeContent"
+ ng-click="message.loadUnsafeContent()">
+
diff --git a/UI/WebServerResources/js/Mailer/message-model.js b/UI/WebServerResources/js/Mailer/message-model.js
index 4f13df5c7..e6b1bf231 100644
--- a/UI/WebServerResources/js/Mailer/message-model.js
+++ b/UI/WebServerResources/js/Mailer/message-model.js
@@ -13,6 +13,8 @@
function Message(accountId, mailbox, futureMessageData) {
this.accountId = accountId;
this.$mailbox = mailbox;
+ this.$hasUnsafeContent = false;
+ this.$loadUnsafeContent = false;
// Data is immediately available
if (typeof futureMessageData.then !== 'function') {
//console.debug(JSON.stringify(futureMessageData, undefined, 2));
@@ -124,6 +126,15 @@
return address;
};
+ /**
+ * @function loadUnsafeContent
+ * @memberof Message.prototype
+ * @desc Mark the message to load unsafe resources when calling $content().
+ */
+ Message.prototype.loadUnsafeContent = function() {
+ this.$loadUnsafeContent = true;
+ };
+
/**
* @function $content
* @memberof Message.prototype
@@ -131,8 +142,31 @@
* @returns the HTML representation of the body
*/
Message.prototype.$content = function() {
- this.hasUnsafeContent = (this.content.indexOf(' unsafe-') > -1);
- return Message.$sce.trustAs('html', this.content);
+ var _this = this;
+
+ if (this.$loadUnsafeContent) {
+ if (angular.isUndefined(this.unsafeContent)) {
+ this.unsafeContent = document.createElement('div');
+ this.unsafeContent.innerHTML = this.content;
+ angular.forEach(['src', 'data', 'classid', 'background', 'style'], function(suffix) {
+ var elements = _this.unsafeContent.querySelectorAll('[unsafe-' + suffix + ']'),
+ element,
+ value,
+ i;
+ for (i = 0; i < elements.length; i++) {
+ element = angular.element(elements[i]);
+ value = element.attr('unsafe-' + suffix);
+ element.attr(suffix, value);
+ element.removeAttr('unsafe-' + suffix);
+ }
+ });
+ }
+ this.$hasUnsafeContent = false;
+ return Message.$sce.trustAs('html', this.unsafeContent.innerHTML);
+ }
+ else {
+ return Message.$sce.trustAs('html', this.content);
+ }
};
/**
@@ -212,6 +246,7 @@
* @see {@link Message.$reply}
* @see {@link Message.$replyAll}
* @see {@link Message.$forwad}
+ * @param {string} action - the HTTP action to perform on the message
* @returns a promise of the HTTP operations
*/
Message.prototype.$newDraft = function(action) {
@@ -315,6 +350,8 @@
angular.extend(_this, data);
_this.id = _this.$absolutePath();
_this.$formatFullAddresses();
+ _this.$hasUnsafeContent = (_this.content.indexOf(' unsafe-') > -1);
+ _this.$loadUnsafeContent = false;
deferred.resolve(_this);
});
if (!_this.isread) {
diff --git a/UI/WebServerResources/js/MailerUI.js b/UI/WebServerResources/js/MailerUI.js
index abcb76997..7a93bc4cb 100644
--- a/UI/WebServerResources/js/MailerUI.js
+++ b/UI/WebServerResources/js/MailerUI.js
@@ -244,22 +244,6 @@
.controller('MessageCtrl', ['$scope', '$rootScope', '$stateParams', '$state', 'stateAccount', 'stateMailbox', 'stateMessage', '$timeout', 'encodeUriFilter', 'sgFocus', 'sgDialog', 'sgAccount', 'sgMailbox', function($scope, $rootScope, $stateParams, $state, stateAccount, stateMailbox, stateMessage, $timeout, encodeUriFilter, focus, Dialog, Account, Mailbox) {
$rootScope.message = stateMessage;
- $scope.loadImages = function() {
- // Load external resources
- angular.forEach(['src', 'data', 'classid', 'background', 'style'], function(suffix) {
- var elements = document.querySelectorAll('#messageView [unsafe-' + suffix + ']'),
- element,
- value,
- i;
- for (i = 0; i < elements.length; i++) {
- element = angular.element(elements[i]);
- value = element.attr('unsafe-' + suffix);
- element.attr(suffix, value);
- element.removeAttr('unsafe-' + suffix);
- }
- stateMessage.hasUnsafeContent = false;
- });
- };
$scope.doDelete = function() {
stateMailbox.$deleteMessages([stateMessage.uid]).then(function() {
// Remove card from list of addressbook