@@ -3141,6 +3141,69 @@ TEST_F(ValueSerializerTestWithHostObject, RoundTripHostJSObject) {
3141
3141
ExpectScriptTrue (" result.a === result.b" );
3142
3142
}
3143
3143
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
+
3144
3207
class ValueSerializerTestWithHostArrayBufferView
3145
3208
: public ValueSerializerTestWithHostObject {
3146
3209
protected:
0 commit comments