diff --git a/mojo/public/js/codec.js b/mojo/public/js/codec.js
index 5440abe..f071d2f 100644
--- a/mojo/public/js/codec.js
+++ b/mojo/public/js/codec.js
@@ -8,7 +8,9 @@
 ], function(unicode, buffer) {
 
   var kErrorUnsigned = "Passing negative value to unsigned";
-  var kErrorArray = "Passing non-array-like to array";
+  var kErrorArray = "Passing non Array for array type";
+  var kErrorString = "Passing non String for string type";
+  var kErrorMap = "Passing non Map for map type";
 
   // Memory -------------------------------------------------------------------
 
@@ -353,7 +355,7 @@
       this.encodePointer(val);
       return;
     }
-    if (val.length === undefined) {
+    if (!(val instanceof Array)) {
       throw new Error(kErrorArray);
     }
     var numberOfElements = val.length;
@@ -369,6 +371,10 @@
       this.encodePointer(val);
       return;
     }
+    // This only accepts string literals, not objects like new String("foo").
+    if (typeof(val) !== "string") {
+      throw new Error(kErrorString);
+    }
     var encodedSize = kArrayHeaderSize + unicode.utf8Length(val);
     var encoder = this.createAndEncodeEncoder(encodedSize);
     encoder.encodeString(val);
@@ -394,6 +400,9 @@
       this.encodePointer(val);
       return;
     }
+    if (!(val instanceof Map)) {
+      throw new Error(kErrorMap);
+    }
     var encodedSize = kStructHeaderSize + kMapStructPayloadSize;
     var encoder = this.createAndEncodeEncoder(encodedSize);
     encoder.encodeMap(keyClass, valueClass, val);
diff --git a/mojo/public/js/codec_unittests.js b/mojo/public/js/codec_unittests.js
index 82e7c5e..80aa7bd 100644
--- a/mojo/public/js/codec_unittests.js
+++ b/mojo/public/js/codec_unittests.js
@@ -15,7 +15,7 @@
   testTypes();
   testAlign();
   testUtf8();
-  testArrayPointerValidation();
+  testTypedPointerValidation();
   this.result = "PASS";
 
   function testBar() {
@@ -257,17 +257,35 @@
     expect(str2).toEqual(str);
   }
 
-  function testArrayPointerValidation() {
+  function testTypedPointerValidation() {
+    var encoder = new codec.MessageBuilder(42, 24).createEncoder(8);
     function DummyClass() {};
-    var builder = new codec.MessageBuilder(42, 24);
-    var encoder = builder.createEncoder(8);
-    expect(function() {
-      // Pass something that is not an array it should throw.
-      encoder.encodeArrayPointer(DummyClass, 75);
-    }).toThrow();
+    var testCases = [
+      // method, args, invalid examples, valid examples
+      [encoder.encodeArrayPointer, [DummyClass], [75], [[], null, undefined]],
+      [encoder.encodeStringPointer, [], [75, new String("foo")],
+          ["", "bar", null, undefined]],
+      [encoder.encodeMapPointer, [DummyClass, DummyClass], [75],
+          [new Map(), null, undefined]],
+    ];
 
-    // An empty array or null should do nothing and be fine.
-    encoder.encodeArrayPointer(DummyClass, []);
-    encoder.encodeArrayPointer(DummyClass, null);
+    testCases.forEach(function(test) {
+      var method = test[0];
+      var baseArgs = test[1];
+      var invalidExamples = test[2];
+      var validExamples = test[3];
+
+      var encoder = new codec.MessageBuilder(42, 24).createEncoder(8);
+      invalidExamples.forEach(function(invalid) {
+        expect(function() {
+          method.apply(encoder, baseArgs.concat(invalid));
+        }).toThrow();
+      });
+
+      validExamples.forEach(function(valid) {
+        var encoder = new codec.MessageBuilder(42, 24).createEncoder(8);
+        method.apply(encoder, baseArgs.concat(valid));
+      });
+    });
   }
 });
