Integrated internal changes from Google
diff --git a/js/proto3_test.js b/js/proto3_test.js
index 3c929ef..81d6de2 100644
--- a/js/proto3_test.js
+++ b/js/proto3_test.js
@@ -38,6 +38,12 @@
 goog.require('proto.jspb.test.Proto3Enum');
 goog.require('proto.jspb.test.TestProto3');
 
+// CommonJS-LoadFromFile: google/protobuf/timestamp_pb proto.google.protobuf
+goog.require('proto.google.protobuf.Timestamp');
+
+// CommonJS-LoadFromFile: google/protobuf/struct_pb proto.google.protobuf
+goog.require('proto.google.protobuf.Struct');
+
 
 var BYTES = new Uint8Array([1, 2, 8, 9]);
 var BYTES_B64 = goog.crypt.base64.encodeByteArray(BYTES);
@@ -326,4 +332,36 @@
     assertTrue(bytesCompare(msg.getOptionalBytes(), BYTES));
 
   });
+
+  it('testTimestampWellKnownType', function() {
+    var msg = new proto.google.protobuf.Timestamp();
+    msg.fromDate(new Date(123456789));
+    assertEquals(123456, msg.getSeconds());
+    assertEquals(789000000, msg.getNanos());
+    var date = msg.toDate();
+    assertEquals(123456789, date.getTime());
+  });
+
+  it('testStructWellKnownType', function() {
+    var jsObj = {
+      abc: "def",
+      number: 12345.678,
+      nullKey: null,
+      boolKey: true,
+      listKey: [1, null, true, false, "abc"],
+      structKey: {foo: "bar", somenum: 123},
+      complicatedKey: [{xyz: {abc: [3, 4, null, false]}}, "zzz"]
+    };
+
+    var struct = proto.google.protobuf.Struct.fromJavaScript(jsObj);
+    var jsObj2 = struct.toJavaScript();
+
+    assertEquals("def", jsObj2.abc);
+    assertEquals(12345.678, jsObj2.number);
+    assertEquals(null, jsObj2.nullKey);
+    assertEquals(true, jsObj2.boolKey);
+    assertEquals("abc", jsObj2.listKey[4]);
+    assertEquals("bar", jsObj2.structKey.foo);
+    assertEquals(4, jsObj2.complicatedKey[0].xyz.abc[1]);
+  });
 });