@@ -3139,6 +3139,69 @@ TEST_F(ValueSerializerTestWithHostObject, RoundTripHostJSObject) {
31393139 ExpectScriptTrue (" result.a === result.b" );
31403140}
31413141
3142+ TEST_F (ValueSerializerTestWithHostObject, RoundTripJSErrorObject) {
3143+ i::DisableHandleChecksForMockingScope mocking_scope;
3144+
3145+ EXPECT_CALL (serializer_delegate_, HasCustomHostObject (isolate ()))
3146+ .WillOnce (Invoke ([](Isolate* isolate) { return true ; }));
3147+ EXPECT_CALL (serializer_delegate_, IsHostObject (isolate (), _))
3148+ .WillRepeatedly (Invoke ([this ](Isolate* isolate, Local<Object> object) {
3149+ EXPECT_TRUE (object->IsObject ());
3150+ Local<Context> context = isolate->GetCurrentContext ();
3151+ return object->Has (context, StringFromUtf8 (" my_host_object" ));
3152+ }));
3153+ // Read/Write HostObject methods are not invoked for non-host JSErrors.
3154+ EXPECT_CALL (serializer_delegate_, WriteHostObject (isolate (), _)).Times (0 );
3155+ EXPECT_CALL (deserializer_delegate_, ReadHostObject (isolate ())).Times (0 );
3156+
3157+ RoundTripTest (
3158+ " var e = new Error('before serialize');"
3159+ " ({ a: e, get b() { return this.a; } })" );
3160+ ExpectScriptTrue (" !('my_host_object' in result)" );
3161+ ExpectScriptTrue (" !('my_host_object' in result.a)" );
3162+ ExpectScriptTrue (" result.a.message === 'before serialize'" );
3163+ ExpectScriptTrue (" result.a instanceof Error" );
3164+ ExpectScriptTrue (" result.a === result.b" );
3165+ }
3166+
3167+ TEST_F (ValueSerializerTestWithHostObject, RoundTripHostJSErrorObject) {
3168+ i::DisableHandleChecksForMockingScope mocking_scope;
3169+
3170+ EXPECT_CALL (serializer_delegate_, HasCustomHostObject (isolate ()))
3171+ .WillOnce (Invoke ([](Isolate* isolate) { return true ; }));
3172+ EXPECT_CALL (serializer_delegate_, IsHostObject (isolate (), _))
3173+ .WillRepeatedly (Invoke ([this ](Isolate* isolate, Local<Object> object) {
3174+ EXPECT_TRUE (object->IsObject ());
3175+ Local<Context> context = isolate->GetCurrentContext ();
3176+ return object->Has (context, StringFromUtf8 (" my_host_object" ));
3177+ }));
3178+ EXPECT_CALL (serializer_delegate_, WriteHostObject (isolate (), _))
3179+ .WillOnce (Invoke ([this ](Isolate*, Local<Object> object) {
3180+ EXPECT_TRUE (object->IsObject ());
3181+ WriteExampleHostObjectTag ();
3182+ return Just (true );
3183+ }));
3184+ EXPECT_CALL (deserializer_delegate_, ReadHostObject (isolate ()))
3185+ .WillOnce (Invoke ([this ](Isolate* isolate) {
3186+ EXPECT_TRUE (ReadExampleHostObjectTag ());
3187+ Local<Context> context = isolate->GetCurrentContext ();
3188+ Local<Object> obj =
3189+ v8::Exception::Error (StringFromUtf8 (" deserialized" )).As <Object>();
3190+ obj->Set (context, StringFromUtf8 (" my_host_object" ), v8::True (isolate))
3191+ .Check ();
3192+ return obj;
3193+ }));
3194+ RoundTripTest (
3195+ " var e = new Error('before serialize');"
3196+ " e.my_host_object = true;"
3197+ " ({ a: e, get b() { return this.a; } })" );
3198+ ExpectScriptTrue (" !('my_host_object' in result)" );
3199+ ExpectScriptTrue (" result.a.my_host_object" );
3200+ ExpectScriptTrue (" result.a.message === 'deserialized'" );
3201+ ExpectScriptTrue (" result.a instanceof Error" );
3202+ ExpectScriptTrue (" result.a === result.b" );
3203+ }
3204+
31423205class ValueSerializerTestWithHostArrayBufferView
31433206 : public ValueSerializerTestWithHostObject {
31443207 protected:
0 commit comments