aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ngSanitize/sanitize.js7
-rw-r--r--test/ngSanitize/sanitizeSpec.js52
2 files changed, 58 insertions, 1 deletions
diff --git a/src/ngSanitize/sanitize.js b/src/ngSanitize/sanitize.js
index e669e77a..1e424d69 100644
--- a/src/ngSanitize/sanitize.js
+++ b/src/ngSanitize/sanitize.js
@@ -378,7 +378,12 @@ function decodeEntities(value) {
var content = parts[2];
if (content) {
hiddenPre.innerHTML=content.replace(/</g,"&lt;");
- content = hiddenPre.innerText || hiddenPre.textContent;
+ // innerText depends on styling as it doesn't display hidden elements.
+ // Therefore, it's better to use textContent not to cause unnecessary
+ // reflows. However, IE<9 don't support textContent so the innerText
+ // fallback is necessary.
+ content = 'textContent' in hiddenPre ?
+ hiddenPre.textContent : hiddenPre.innerText;
}
return spaceBefore + content + spaceAfter;
}
diff --git a/test/ngSanitize/sanitizeSpec.js b/test/ngSanitize/sanitizeSpec.js
index 1958ec0f..fbffbba5 100644
--- a/test/ngSanitize/sanitizeSpec.js
+++ b/test/ngSanitize/sanitizeSpec.js
@@ -411,3 +411,55 @@ describe('HTML', function() {
});
});
});
+
+describe('decodeEntities', function() {
+ var handler, text,
+ origHiddenPre = window.hiddenPre;
+
+ beforeEach(function() {
+ text = '';
+ handler = {
+ start: function() {},
+ chars: function(text_){
+ text = text_;
+ },
+ end: function() {},
+ comment: function() {}
+ };
+ module('ngSanitize');
+ });
+
+ afterEach(function() {
+ window.hiddenPre = origHiddenPre;
+ });
+
+ it('should use innerText if textContent is not available (IE<9)', function() {
+ window.hiddenPre = {
+ innerText: 'INNER_TEXT'
+ };
+ inject(function($sanitize) {
+ htmlParser('<tag>text</tag>', handler);
+ expect(text).toEqual('INNER_TEXT');
+ });
+ });
+ it('should use textContent if available', function() {
+ window.hiddenPre = {
+ textContent: 'TEXT_CONTENT',
+ innerText: 'INNER_TEXT'
+ };
+ inject(function($sanitize) {
+ htmlParser('<tag>text</tag>', handler);
+ expect(text).toEqual('TEXT_CONTENT');
+ });
+ });
+ it('should use textContent even if empty', function() {
+ window.hiddenPre = {
+ textContent: '',
+ innerText: 'INNER_TEXT'
+ };
+ inject(function($sanitize) {
+ htmlParser('<tag>text</tag>', handler);
+ expect(text).toEqual('');
+ });
+ });
+});