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