diff --git a/src/Angular.js b/src/Angular.js index 52e74cbf396c..fa1039ef6d51 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -263,7 +263,7 @@ function forEach(obj, iterator, context) { obj.forEach(iterator, context, obj); } else { for (key in obj) { - if (obj.hasOwnProperty(key)) { + if (hasOwnProperty.call(obj, key)) { iterator.call(context, obj[key], key, obj); } } diff --git a/src/ng/directive/form.js b/src/ng/directive/form.js index 29c546d064ff..c62717f3e462 100644 --- a/src/ng/directive/form.js +++ b/src/ng/directive/form.js @@ -67,8 +67,8 @@ function FormController(element, attrs, $scope, $animate, $interpolate) { var parentForm = form.$$parentForm = element.parent().controller('form') || nullFormCtrl; // init state - form.$error = {}; - form.$$success = {}; + form.$error = createMap(); + form.$$success = createMap(); form.$pending = undefined; form.$name = $interpolate(attrs.name || attrs.ngForm || '')($scope); form.$dirty = false; diff --git a/src/ng/directive/ngModel.js b/src/ng/directive/ngModel.js index de1a5c491efa..2c25895569cc 100644 --- a/src/ng/directive/ngModel.js +++ b/src/ng/directive/ngModel.js @@ -233,8 +233,8 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$ this.$dirty = false; this.$valid = true; this.$invalid = false; - this.$error = {}; // keep invalid keys here - this.$$success = {}; // keep valid keys here + this.$error = createMap(); // keep invalid keys here + this.$$success = createMap(); // keep valid keys here this.$pending = undefined; // keep pending keys here this.$name = $interpolate($attr.name || '', false)($scope); diff --git a/test/ng/directive/ngModelSpec.js b/test/ng/directive/ngModelSpec.js index 583414deaa9c..d23cb0298afc 100644 --- a/test/ng/directive/ngModelSpec.js +++ b/test/ng/directive/ngModelSpec.js @@ -54,6 +54,22 @@ describe('ngModel', function() { }); + it('should ignore items in prototype chain when determining validity', inject(function($compile) { + dealoc(element); + Object.prototype.someProp = true; + element = $compile('
')(scope); + var input = element.children().eq(0); + ctrl = input.controller('ngModel'); + var form = element.controller('form'); + scope.$digest(); + expect(ctrl.$valid).toBe(true); + expect(element.children()).toBeValid(); + expect(form.$valid).toBe(true); + expect(element).toBeValid(); + delete Object.prototype.someProp; + })); + + describe('setValidity', function() { function expectOneError() {