@@ -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