Skip to content

Commit ada29bb

Browse files
committed
fix(form): ignore properties in prototype chain in $error
Closes angular#10469
1 parent 32eec67 commit ada29bb

File tree

4 files changed

+21
-5
lines changed

4 files changed

+21
-5
lines changed

src/Angular.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ function forEach(obj, iterator, context) {
263263
obj.forEach(iterator, context, obj);
264264
} else {
265265
for (key in obj) {
266-
if (obj.hasOwnProperty(key)) {
266+
if (hasOwnProperty.call(obj, key)) {
267267
iterator.call(context, obj[key], key, obj);
268268
}
269269
}

src/ng/directive/form.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ function FormController(element, attrs, $scope, $animate, $interpolate) {
6767
var parentForm = form.$$parentForm = element.parent().controller('form') || nullFormCtrl;
6868

6969
// init state
70-
form.$error = {};
71-
form.$$success = {};
70+
form.$error = createMap();
71+
form.$$success = createMap();
7272
form.$pending = undefined;
7373
form.$name = $interpolate(attrs.name || attrs.ngForm || '')($scope);
7474
form.$dirty = false;

src/ng/directive/input.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -1744,8 +1744,8 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
17441744
this.$dirty = false;
17451745
this.$valid = true;
17461746
this.$invalid = false;
1747-
this.$error = {}; // keep invalid keys here
1748-
this.$$success = {}; // keep valid keys here
1747+
this.$error = createMap(); // keep invalid keys here
1748+
this.$$success = createMap(); // keep valid keys here
17491749
this.$pending = undefined; // keep pending keys here
17501750
this.$name = $interpolate($attr.name || '', false)($scope);
17511751

test/ng/directive/inputSpec.js

+16
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,22 @@ describe('NgModelController', function() {
5050
});
5151

5252

53+
it('should ignore items in prototype chain when determining validity', inject(function($compile) {
54+
dealoc(element);
55+
Object.prototype.someProp = true;
56+
element = $compile('<form name="form"><input type="text" ng-model="value" name="value"></form>')(scope);
57+
var input = element.children().eq(0);
58+
ctrl = input.controller('ngModel');
59+
var form = element.controller('form');
60+
scope.$digest();
61+
expect(ctrl.$valid).toBe(true);
62+
expect(element.children()).toBeValid();
63+
expect(form.$valid).toBe(true);
64+
expect(element).toBeValid();
65+
delete Object.prototype.someProp;
66+
}));
67+
68+
5369
describe('setValidity', function() {
5470

5571
function expectOneError() {

0 commit comments

Comments
 (0)