Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit 31a5b83

Browse files
caitppetebacondarwin
authored andcommitted
fix(form): ignore properties in $error prototype chain
Closes #10469 Closes #10727
1 parent 301e7aa commit 31a5b83

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
@@ -262,7 +262,7 @@ function forEach(obj, iterator, context) {
262262
obj.forEach(iterator, context, obj);
263263
} else {
264264
for (key in obj) {
265-
if (obj.hasOwnProperty(key)) {
265+
if (hasOwnProperty.call(obj, key)) {
266266
iterator.call(context, obj[key], key, obj);
267267
}
268268
}

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/ngModel.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -233,8 +233,8 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
233233
this.$dirty = false;
234234
this.$valid = true;
235235
this.$invalid = false;
236-
this.$error = {}; // keep invalid keys here
237-
this.$$success = {}; // keep valid keys here
236+
this.$error = createMap(); // keep invalid keys here
237+
this.$$success = createMap(); // keep valid keys here
238238
this.$pending = undefined; // keep pending keys here
239239
this.$name = $interpolate($attr.name || '', false)($scope);
240240

test/ng/directive/ngModelSpec.js

+16
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,22 @@ describe('ngModel', function() {
5454
});
5555

5656

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

5975
function expectOneError() {

0 commit comments

Comments
 (0)