From ada29bb42b01720fdd032992eb02e747c3807eb8 Mon Sep 17 00:00:00 2001 From: Caitlin Potter Date: Mon, 15 Dec 2014 16:54:11 -0500 Subject: [PATCH] fix(form): ignore properties in prototype chain in $error Closes #10469 --- src/Angular.js | 2 +- src/ng/directive/form.js | 4 ++-- src/ng/directive/input.js | 4 ++-- test/ng/directive/inputSpec.js | 16 ++++++++++++++++ 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/Angular.js b/src/Angular.js index 5b8e78538b15..d72230fa6831 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/input.js b/src/ng/directive/input.js index 24bf1a8030fe..3e2d8edfd835 100644 --- a/src/ng/directive/input.js +++ b/src/ng/directive/input.js @@ -1744,8 +1744,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/inputSpec.js b/test/ng/directive/inputSpec.js index f034172246bd..f42cd0587e4e 100644 --- a/test/ng/directive/inputSpec.js +++ b/test/ng/directive/inputSpec.js @@ -50,6 +50,22 @@ describe('NgModelController', 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() {