Integrated internal changes from Google
diff --git a/js/binary/proto_test.js b/js/binary/proto_test.js
index 26e1d30..ae50a70 100644
--- a/js/binary/proto_test.js
+++ b/js/binary/proto_test.js
@@ -32,6 +32,7 @@
 
 goog.require('goog.crypt.base64');
 goog.require('goog.testing.asserts');
+goog.require('jspb.BinaryWriter');
 goog.require('jspb.Message');
 
 // CommonJS-LoadFromFile: ../testbinary_pb proto.jspb.test
@@ -87,6 +88,9 @@
 goog.require('proto.jspb.test.extendRepeatedUint32List');
 goog.require('proto.jspb.test.extendRepeatedUint64List');
 
+// CommonJS-LoadFromFile: google/protobuf/any_pb proto.google.protobuf
+goog.require('proto.google.protobuf.Any');
+
 
 var suite = {};
 
@@ -194,8 +198,6 @@
  * @param {proto.jspb.test.TestAllTypes} copy
  */
 function checkAllFields(original, copy) {
-  assertTrue(jspb.Message.equals(original, copy));
-
   assertEquals(copy.getOptionalInt32(), -42);
   assertEquals(copy.getOptionalInt64(), -0x7fffffff00000000);
   assertEquals(copy.getOptionalUint32(), 0x80000000);
@@ -270,6 +272,9 @@
   assertElementsEquals(copy.getPackedRepeatedFloatList(), [1.5]);
   assertElementsEquals(copy.getPackedRepeatedDoubleList(), [-1.5]);
 
+
+  // Check last so we get more granular errors first.
+  assertTrue(jspb.Message.equals(original, copy));
 }
 
 
@@ -625,4 +630,36 @@
     var decoded = proto.jspb.test.TestExtendable.deserializeBinary(encoded);
     checkExtensions(decoded);
   });
+
+  /**
+   * Tests that unknown extensions don't cause deserialization failure.
+   */
+  it('testUnknownExtension', function() {
+    var msg = new proto.jspb.test.TestExtendable();
+    fillExtensions(msg);
+    var writer = new jspb.BinaryWriter();
+    writer.writeBool((1 << 29) - 1, true);
+    proto.jspb.test.TestExtendable.serializeBinaryToWriter(msg, writer);
+    var encoded = writer.getResultBuffer();
+    var decoded = proto.jspb.test.TestExtendable.deserializeBinary(encoded);
+    checkExtensions(decoded);
+  });
+
+  it('testAnyWellKnownType', function() {
+    var any = new proto.google.protobuf.Any();
+    var msg = new proto.jspb.test.TestAllTypes();
+
+    fillAllFields(msg);
+
+    any.pack(msg.serializeBinary(), 'jspb.test.TestAllTypes');
+
+    assertEquals('type.googleapis.com/jspb.test.TestAllTypes',
+                 any.getTypeUrl());
+
+    var msg2 = any.unpack(
+        proto.jspb.test.TestAllTypes.deserializeBinary,
+        'jspb.test.TestAllTypes');
+
+    checkAllFields(msg, msg2);
+  });
 });