From 8aa31da4dda4e9a760014d02342230906917d748 Mon Sep 17 00:00:00 2001
From: Martin Staffa <mjstaffa@googlemail.com>
Date: Sun, 9 Mar 2014 20:17:55 +0100
Subject: [PATCH 1/3] fix(filterFilter): comparator should return true if deep
 object key is undefined

---
 src/ng/filter/filter.js      | 6 ++++--
 test/ng/filter/filterSpec.js | 2 ++
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/ng/filter/filter.js b/src/ng/filter/filter.js
index 5c6bf2d79e7e..105ff535dc09 100644
--- a/src/ng/filter/filter.js
+++ b/src/ng/filter/filter.js
@@ -138,8 +138,10 @@ function filterFilter() {
         comparator = function(obj, text) {
           if (obj && text && typeof obj === 'object' && typeof text === 'object') {
             for (var objKey in obj) {
-              if (objKey.charAt(0) !== '$' && hasOwnProperty.call(obj, objKey) &&
-                  comparator(obj[objKey], text[objKey])) {
+              if (objKey.charAt(0) !== '$' &&
+                  hasOwnProperty.call(obj, objKey) &&
+                  (!isDefined(text[objKey]) || comparator(obj[objKey], text[objKey]))
+              ) {
                 return true;
               }
             }
diff --git a/test/ng/filter/filterSpec.js b/test/ng/filter/filterSpec.js
index 7679136ac9f9..2b59402d64b3 100644
--- a/test/ng/filter/filterSpec.js
+++ b/test/ng/filter/filterSpec.js
@@ -75,6 +75,8 @@ describe('Filter: filter', function() {
                  {person: {name: 'Rita'}},
                  {person: {name: 'Billy'}},
                  {person: {name: 'Joan'}}];
+
+    expect(filter(items, {person: {name : undefined}}).length).toBe(4);
     expect(filter(items, {person: {name: 'Jo'}}).length).toBe(2);
     expect(filter(items, {person: {name: 'Jo'}})).toEqual([
       {person: {name: 'John'}}, {person: {name: 'Joan'}}]);

From 4e63e2683e1bae057e4ec54ebf6f7179854337f1 Mon Sep 17 00:00:00 2001
From: Martin Staffa <mjstaffa@googlemail.com>
Date: Sun, 9 Mar 2014 20:20:57 +0100
Subject: [PATCH 2/3] test(filterFilter): undefined object predicate key should
 return true

---
 test/ng/filter/filterSpec.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/test/ng/filter/filterSpec.js b/test/ng/filter/filterSpec.js
index 2b59402d64b3..72e8dca62351 100644
--- a/test/ng/filter/filterSpec.js
+++ b/test/ng/filter/filterSpec.js
@@ -53,6 +53,7 @@ describe('Filter: filter', function() {
     var items = [{first: 'misko', last: 'hevery'},
                  {first: 'adam', last: 'abrons'}];
 
+    expect(filter(items, {first: undefined}).length).toBe(2);
     expect(filter(items, {first:'', last:''}).length).toBe(2);
     expect(filter(items, {first:'', last:'hevery'}).length).toBe(1);
     expect(filter(items, {first:'adam', last:'hevery'}).length).toBe(0);

From 3d9ff4ff41f68904a8a8662aaf93b3b849ab3807 Mon Sep 17 00:00:00 2001
From: Martin Staffa <mjstaffa@googlemail.com>
Date: Sun, 9 Mar 2014 20:31:37 +0100
Subject: [PATCH 3/3] style(filterSpec): multiple small fixes

Mixed spaces / tabs, missing semicolon, typos, already defined variables
---
 test/ng/filter/filterSpec.js | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/test/ng/filter/filterSpec.js b/test/ng/filter/filterSpec.js
index 72e8dca62351..948f7038a3e6 100644
--- a/test/ng/filter/filterSpec.js
+++ b/test/ng/filter/filterSpec.js
@@ -49,7 +49,7 @@ describe('Filter: filter', function() {
     expect(filter(items, function(i) {return i.done;}).length).toBe(1);
   });
 
-  it('should take object as perdicate', function() {
+  it('should take object as predicate', function() {
     var items = [{first: 'misko', last: 'hevery'},
                  {first: 'adam', last: 'abrons'}];
 
@@ -62,7 +62,7 @@ describe('Filter: filter', function() {
   });
 
 
-  it('should support predicat object with dots in the name', function() {
+  it('should support predicate object with dots in the name', function() {
     var items = [{'first.name': 'misko', 'last.name': 'hevery'},
                  {'first.name': 'adam', 'last.name': 'abrons'}];
 
@@ -97,8 +97,8 @@ describe('Filter: filter', function() {
 
   it('should support boolean properties', function() {
     var items = [{name: 'tom', current: true},
-	             {name: 'demi', current: false},
-	             {name: 'sofia'}];
+               {name: 'demi', current: false},
+               {name: 'sofia'}];
 
     expect(filter(items, {current:true}).length).toBe(1);
     expect(filter(items, {current:true})[0].name).toBe('tom');
@@ -121,26 +121,26 @@ describe('Filter: filter', function() {
       expect(filter(items, expr, true)).toEqual([items[1]]);
       expect(filter(items, expr, false)).toEqual([items[1], items[2]]);
 
-      var items = [
+      items = [
         {key: 'value1', nonkey: 1},
         {key: 'value2', nonkey: 2},
         {key: 'value12', nonkey: 3},
         {key: 'value1', nonkey:4},
         {key: 'Value1', nonkey:5}
       ];
-      var expr = {key: 'value1'};
+      expr = {key: 'value1'};
       expect(filter(items, expr, true)).toEqual([items[0], items[3]]);
 
-      var items = [
+      items = [
         {key: 1, nonkey: 1},
         {key: 2, nonkey: 2},
         {key: 12, nonkey: 3},
         {key: 1, nonkey:4}
       ];
-      var expr = { key: 1 };
+      expr = { key: 1 };
       expect(filter(items, expr, true)).toEqual([items[0], items[3]]);
 
-      var expr = 12;
+      expr = 12;
       expect(filter(items, expr, true)).toEqual([items[2]]);
     });
 
@@ -154,7 +154,7 @@ describe('Filter: filter', function() {
       var expr = {key: 10};
       var comparator = function (obj,value) {
         return obj > value;
-      }
+      };
       expect(filter(items, expr, comparator)).toEqual([items[2]]);
 
       expr = 10;