aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMisko Hevery2012-03-19 12:20:57 -0700
committerMisko Hevery2012-03-19 15:49:42 -0700
commit1cc0e4173de01d6c4103910d231a24b2834f4d91 (patch)
tree076fcf51827a4dc8161959de8944a72dff4d0bcf
parentd4ae7988dad88af608db9cf34992c9c748eda6aa (diff)
downloadangular.js-1cc0e4173de01d6c4103910d231a24b2834f4d91.tar.bz2
bug(ie7): incorrectly set all inputs to disabled
In ie7 all of the input fields are set to readonly and disabled, because ie7 enumerates over all attributes even if the are not declared on the element.
-rw-r--r--src/jqLite.js5
-rw-r--r--src/service/compiler.js18
-rw-r--r--test/directive/inputSpec.js23
-rw-r--r--test/jqLiteSpec.js7
4 files changed, 42 insertions, 11 deletions
diff --git a/src/jqLite.js b/src/jqLite.js
index 986d0002..79f22e62 100644
--- a/src/jqLite.js
+++ b/src/jqLite.js
@@ -328,7 +328,7 @@ forEach('multiple,selected,checked,disabled,readOnly,required'.split(','), funct
BOOLEAN_ATTR[lowercase(value)] = value;
});
var BOOLEAN_ELEMENTS = {};
-forEach('input,select,option,textarea,button'.split(','), function(value) {
+forEach('input,select,option,textarea,button,form'.split(','), function(value) {
BOOLEAN_ELEMENTS[uppercase(value)] = true;
});
@@ -394,8 +394,7 @@ forEach({
}
} else {
return (element[name] ||
- element.getAttribute(name) !== null &&
- (msie < 9 ? element.getAttribute(name) !== '' : true))
+ (element.attributes.getNamedItem(name)|| noop).specified)
? lowercasedName
: undefined;
}
diff --git a/src/service/compiler.js b/src/service/compiler.js
index 6cbfc9d3..4ac01a7c 100644
--- a/src/service/compiler.js
+++ b/src/service/compiler.js
@@ -378,17 +378,19 @@ function $CompileProvider($provide) {
for (var attr, name, nName, value, nAttrs = node.attributes,
j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) {
attr = nAttrs[j];
- name = attr.name;
- nName = directiveNormalize(name.toLowerCase());
- attrsMap[nName] = name;
- attrs[nName] = value = trim((msie && name == 'href')
+ if (attr.specified) {
+ name = attr.name;
+ nName = directiveNormalize(name.toLowerCase());
+ attrsMap[nName] = name;
+ attrs[nName] = value = trim((msie && name == 'href')
? decodeURIComponent(node.getAttribute(name, 2))
: attr.value);
- if (isBooleanAttr(node, nName)) {
- attrs[nName] = true; // presence means true
+ if (isBooleanAttr(node, nName)) {
+ attrs[nName] = true; // presence means true
+ }
+ addAttrInterpolateDirective(node, directives, value, nName)
+ addDirective(directives, nName, 'A', maxPriority);
}
- addAttrInterpolateDirective(node, directives, value, nName)
- addDirective(directives, nName, 'A', maxPriority);
}
// use class as directive
diff --git a/test/directive/inputSpec.js b/test/directive/inputSpec.js
index 2a7244c9..22c77f53 100644
--- a/test/directive/inputSpec.js
+++ b/test/directive/inputSpec.js
@@ -316,6 +316,29 @@ describe('input', function() {
});
+ it('should not set readonly or disabled property on ie7', function() {
+ this.addMatchers({
+ toBeOff: function(attributeName) {
+ var actualValue = this.actual.attr(attributeName);
+ this.message = function() {
+ return "Attribute '" + attributeName + "' expected to be off but was '" + actualValue +
+ "' in: " + angular.mock.dump(this.actual);
+ }
+
+ return !actualValue || actualValue == 'false';
+ }
+ });
+
+ compileInput('<input type="text" ng-model="name" name="alias"/>');
+ expect(inputElm.prop('readOnly')).toBe(false);
+ expect(inputElm.prop('disabled')).toBe(false);
+
+ expect(inputElm).toBeOff('readOnly');
+ expect(inputElm).toBeOff('readonly');
+ expect(inputElm).toBeOff('disabled');
+ });
+
+
it('should cleanup it self from the parent form', function() {
compileInput('<input ng-model="name" name="alias" required>');
diff --git a/test/jqLiteSpec.js b/test/jqLiteSpec.js
index 417b912c..fbe6edcb 100644
--- a/test/jqLiteSpec.js
+++ b/test/jqLiteSpec.js
@@ -268,6 +268,13 @@ describe('jqLite', function() {
var elm = jqLite('<div class="any">a</div>');
expect(elm.attr('non-existing')).toBeUndefined();
});
+
+ it('should return undefined for non-existing attributes on input', function() {
+ var elm = jqLite('<input>');
+ expect(elm.attr('readonly')).toBeUndefined();
+ expect(elm.attr('readOnly')).toBeUndefined();
+ expect(elm.attr('disabled')).toBeUndefined();
+ });
});